【问题标题】:MySQL: Count total in Group by QueryMySQL:按查询统计分组中的总数
【发布时间】:2019-02-16 19:43:28
【问题描述】:

我有一张这样的桌子:

---------------------------------- |姓名 |日期 |活动 | ---------------------------------- |约翰 |七月 |电子邮件 | |卡尔 |八月 |电话 | |约翰 |七月 |电话 | |罗伯特 |八月 |电话 | |卡尔 |九月 |电子邮件 | |约翰 |八月 |电话 | |卡尔 |八月 |电子邮件 | |约翰 |七月 |电子邮件 | |罗伯特 |九月 |电话 | |卡尔 |八月 |电子邮件 | ----------------------------------

我计算了按日期和广告系列分组的数据,但我想要一个额外的列来为我提供包含该广告系列的总行数

我使用的查询:

选择活动、名称、 SUM(IF(date = 'July',1,0)) AS 七月, SUM(IF(date = 'August',1,0)) AS 八月, SUM(IF(date = 'September',1,0)) AS 9 月 从表 按名称、活动分组

但我想修改它以获得以下输出:

-------------------------------------------------- -------------------------------------- |活动 |姓名 |七月 |八月 |九月 |七月总和 |八月总和 |九月总和 | -------------------------------------------------- -------------------------------------- 电子邮件约翰 2 0 0 2 2 1 电话约翰 1 1 0 1 3 1 …… ……

我想要按月份区分电话或电子邮件的所有值的总和的列

添加:http://sqlfiddle.com/#!9/8b797a/8

【问题讨论】:

  • 提示:您将需要子查询来解决您的问题。
  • 这是我想申请的选择,但我找不到解决方案。
  • 考虑处理表示层/应用程序级代码中数据显示的问题,假设你有这个问题(例如,一个简单的 PHP 循环作用于有序数组)。不需要子查询。
  • 导出数据到 SQL 我不能使用 PHP 脚本

标签: mysql


【解决方案1】:

试试下面:http://sqlfiddle.com/#!9/8b797a/24:

select a.campaign,a.name,July, August,September,Julysum,Augustsum,Septembersum from 
(SELECT campaign,name,
  SUM(IF(date = 'July',1,0)) AS July,
  SUM(IF(date = 'August',1,0)) AS August,
  SUM(IF(date = 'September',1,0)) AS September
  FROM `table`
  GROUP BY campaign,name)a
  left join
  (select campaign,
  SUM(IF(date = 'July',1,0)) AS Julysum,
  SUM(IF(date = 'August',1,0)) AS Augustsum,
  SUM(IF(date = 'September',1,0)) AS Septembersum
  FROM `table`
  GROUP BY campaign)b on a.campaign=b.campaign
  where name='John'

输出:

campaign    name    July    August  September   campaign    Julysum Augustsum   Septembersum
Email      John     2      0       0           Email         2     2    1
Phone      John     1      1       0           Phone         1     3    1

【讨论】:

  • 谢谢。这个答案非常接近解决方案,但是活动列有 2 倍,并且必须导出导入到无法添加列的系统中的 SQL,这是一个小问题。
  • 我已更新列选择 - 您现在可以查看
【解决方案2】:

我知道这不是您所要求的,但这是使用 GROUP BY ... WITH ROLLUP 获取总数的简单方法:

SELECT Campaign, Name,
  SUM(CASE WHEN Date='July' THEN 1 ELSE 0 END) AS July,
  SUM(CASE WHEN Date='August' THEN 1 ELSE 0 END) AS August,
  SUM(CASE WHEN Date='September' THEN 1 ELSE 0 END) AS September
FROM campaigns
GROUP BY Campaign, Name WITH ROLLUP

输出:

Campaign    Name    July    August  September
Email       Carl    0       2       1
Email       John    2       0       0
Email       (null)  2       2       1
Phone       Carl    0       1       0
Phone       John    1       1       0
Phone       Robert  0       1       1
Phone       (null)  1       3       1
(null)      (null)  3       5       2

每种类型的活动每月的总数显示在活动名称和NULL 值(Name)的行中。每个月(两种类型的广告系列)的总计显示在底部一行,NULL 的值为 CampaignName

SQLFiddle Demo

【讨论】:

  • 感谢您的帮助,这对我来说不是一个好的解决方案,我需要它们作为列而不是行。
  • 别担心,我不知道你有多么受限制,所以认为我应该提供这个
猜你喜欢
  • 2019-06-20
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
相关资源
最近更新 更多