【问题标题】:SQL Statement - Create a Report with three totalsSQL 语句 - 创建包含三个总计的报告
【发布时间】:2016-01-16 23:09:28
【问题描述】:

在 mysql 中创建这个查询有点麻烦。我想我遗漏了一些明显的东西。

我有一个用户表,其中有一列称为设备(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 用户总数?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    对于每种类型的设备,您可以使用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
    

    【讨论】:

      【解决方案2】:

      也可以在设备上分组,而不仅仅是日期:

      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 修饰符。

      【讨论】:

      • 不,它将通过分组device返回3行
      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2021-12-21
      相关资源
      最近更新 更多