SQL语句 - 使用三个总计创建报告

时间:2016-01-16 23:09:28

标签: mysql sql

在mysql中创建此查询时遇到一些麻烦。我想我错过了一些明显的东西。

我有一个Users表,其中有一个名为device的列(Android,iOs,Windows是3个可能的值)。我想创建一个报告,告诉我每天注册的用户数量(按日期分组),但是每个设备(每列中的总数)。

我能够创建一个查询,告诉我有多少用户注册为第一列的总数,但无法在接下来的几列中使用子查询。

现在我尝试的工作查询是:

SELECT COUNT(u.userid) 'Total Users', date(u.datecreated) 'Day'
FROM Users
GROUP BY date(u.datecreated)
ORDER BY u.datecreated DESC

这为我生成了一个很好的汇总报告,显示了每天创建的用户数(总数是一列,总数的日期是第二列)

因此,扩展上面的工作查询,我尝试制作一个像这样的子查询,但它不断生成'1'作为新列的结果。

select count(distinct u.userid) 'Total Users', 
(select count(u1.userid) from Users u1 where u1.datecreated = u1.datecreated and u.device = 'android' group by u1.datecreated) 'Android Users',
date(u.datecreated) 'Day'
from Users u
group by date(u.datecreated)
order by u.datecreated desc

我怎样才能获得那个内部查询来生成当天的Android用户总数?

2 个答案:

答案 0 :(得分:0)

对于每种类型的设备,您都可以使用CASE声明计算小计。

试试这个:

SELECT
    COUNT(u.userid) 'Total Users',
    SUM(CASE WHEN device = 'android' THEN 1 END) Android,
    SUM(CASE WHEN device = 'iOs' THEN 1 END) iOs,
    SUM(CASE WHEN device = 'Windows' THEN 1 END) Windows,
    date(u.datecreated) 'Day'
FROM Users
GROUP BY date(u.datecreated)
ORDER BY date(u.datecreated) DESC

答案 1 :(得分:0)

只需在设备上分组,而不仅仅是在日期:

SELECT COUNT(u.userid) 'Total Users', date(u.datecreated) 'Day', device
FROM Users
GROUP BY date(u.datecreated), device
ORDER BY u.datecreated DESC

如果你想要一个单独的行按天保持总数,你可以在末尾添加with rollup修饰符。