mysql - 在具有不同 WHERE 的一列上进行多项选择

标签 mysql

我有一张这样的 table

ID,date,state    
1,2015-04-04,1    
1,2015-05-04,0

我想提出这样的请求:

SELECT 
(YEAR(date)) AS year_A, 
(MONTH(date)) AS month_A, 
(count(*)) AS number_A,
(count(*) WHERE state = 0) AS number_B
(count(*) WHERE state = 1) AS number_C
 FROM A_transaction GROUP BY year_A, month_A

得到这样的东西

year_A,month_A,number_A,number_B,number_C    
2015,04,2,1,1

但这行不通。我认为问题出在 WHERE 子句上

最佳答案

您需要使用条件聚合来编写查询(即仅当条件为真时才使用 COUNT)。这将为您提供所需的结果:

SELECT YEAR(date) AS year_A, 
       MONTH(date) AS month_A, 
       count(*) AS number_A,
       count(CASE WHEN state = 0 THEN 1 END) AS number_B,
       count(CASE WHEN state = 1 THEN 1 END) AS number_C
FROM A_transaction 
GROUP BY year_A, month_A

请注意,您不需要将表达式括在括号中。它们只会让您的查询更难阅读。

另请注意,标准的 MySQL 日期格式是 YYYY-MM-DD 这意味着您表中的两个示例日期实际上是在不同的月份,查询的输出是

year_A  month_A number_A    number_B    number_C
2015    4       1           0           1
2015    5       1           1           0

如果您的日期是 YYYY-DD-MM 格式,您需要使用 STR_TO_DATE 进行转换,例如

SELECT YEAR(STR_TO_DATE(date, '%Y-%d-%m')) AS year_A, 
       MONTH(STR_TO_DATE(date, '%Y-%d-%m')) AS month_A, 
       count(*) AS number_A,
       count(CASE WHEN state = 0 THEN 1 END) AS number_B,
       count(CASE WHEN state = 1 THEN 1 END) AS number_C
FROM A_transaction 
GROUP BY year_A, month_A

Demo on dbfiddle

关于mysql - 在具有不同 WHERE 的一列上进行多项选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991439/

相关文章:

php - jQuery 发布并导出到 XLS 文件

mysql - 如果列包含重复数据 SQL 则删除行

php - 使用 PHP 将当前的 WordPress ID 获取到我的数据库中

php - 比较两个独立阵列的 GPS 坐标

mysql - Fisrt insert 和同一日期的 last insert 的单日时间戳差异

mysql 选择行数

android - 传递大型 Parcelable 或传递 id 和查询数据库是否更有效?

mysql - 如何查找列表/集合是否包含在另一个列表中

Php使用日期时间和组对mysql进行计数

php - 如何获取颜色和服务的 $row 数据