mysql - 通过计数语句的多行和多列

标签 mysql sql count sum

所以我打算在MySQL中查询几个图表的数据, 图表的数据来自同一个表,但适用于多个时间范围。所以分组依据不起作用。

我想要的日期格式

Total   Oranges  Mangoes  Bananas  Tomatoes
----------------------------------------------
19       5        6          7        1
24       3        7          2        12
14       3        4          5        2
20       5        7          6        2

现在,我可以使用以下任一方法获取初始行

SELECT 
sum(CASE WHEN Some_Criteria and (created between '2016-03-28' AND '2016-03-29')) THEN 1 ELSE 0 END ) Total , 
sum(CASE WHEN Some_Other_Criteria  and (created between '2016-03-28' AND '2016-03-29')) THEN 1 ELSE 0 END ) Oranges
...
from SomeTable.Table1
left join OtherTable ON SomeId = OtherId

或通过

SELECT
(SELECT count(distinct Field) FROM from SomeTable.Table1 left join OtherTable ON SomeId = OtherId WHERE SomeCriteria and (DateRange)) AS Total
(SELECT count(distinct Field) FROM from SomeTable.Table1 left join OtherTable ON SomeId = OtherId WHERE SomeCriteria and (DateRange)) AS Oranges
...

将其放在同一行中很容易,因为我只需使用上述方法,但是如果我希望数据位于多行中但基于不同的日期范围怎么办?

最佳答案

您将需要结果集中的这些日期范围(子查询、临时表或某种永久表)。完成后,您可以将第一个查询与 JOIN 一起使用到您的范围表,然后在这些范围上使用 GROUP BY

例如:

SELECT
    DR.start_date,
    DR.end_date,
    SUM(CASE WHEN Some_Criteria AND (created BETWEEN DR.start_date AND DR.end_date)) THEN 1 ELSE 0 END ) Total,
    SUM(CASE WHEN Some_Other_Criteria AND (created BETWEEN DR.start_date AND DR.end_date)) THEN 1 ELSE 0 END ) Oranges,
...
FROM
    Date_Ranges DR
INNER JOIN SomeTable.Table1 T1 ON
    T1.created >= DR.start_date AND
    T1.created < DR.end_date
LEFT OUTER JOIN OtherTable OT ON OT.SomeId = T1.OtherId
GROUP BY
    DR.start_date,
    DR.end_date

关于mysql - 通过计数语句的多行和多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262521/

相关文章:

java - Listview圆角选择器问题

mysql - 计算mysql中具有相同值的行,然后显示项目编号

MySQL 查询优化 - distinct、order by 和 limit

mysql - Case 语句 Mysql 查询根据条件加载数据

mysql - 无法在 MySQL Workbench 中创建外键

Java MySql 通讯链路失败

mysql - MySQL 触发错误

sql - 转置数据以创建表

MySQL 如何在一个查询中返回 COUNT 总数以及使用 GROUP BY 的 COUNT

mysql - 搜索至少1次命中,mysql并join