mysql - 计算日期相等但按名称分隔的行

标签 mysql

我认为从我拥有的表格和我想要的结果开始是最简单的。

Name | Date
A    | 03/01/2012
A    | 03/01/2012
B    | 02/01/2012
A    | 02/01/2012
B    | 02/01/2012
A    | 02/01/2012
B    | 01/01/2012
B    | 01/01/2012
A    | 01/01/2012

我希望我的查询结果是:

Name | 01/01/2012 | 02/01/2012 | 03/01/2012
A    |     1      |     2      |     2
B    |     2      |     2      |     0

所以基本上我想计算具有相同日期的行数,但对于每个单独的名称。所以一个简单的日期分组是行不通的,因为它会将名称合并在一起。然后我想使用 php 输出一个显示每个日期计数的表格。

我看到的答案是这样的:

SELECT
  NAME,
  SUM(CASE WHEN GRADE = 1 THEN 1 ELSE 0 END) AS GRADE1,
  SUM(CASE WHEN GRADE = 2 THEN 1 ELSE 0 END) AS GRADE2,
  SUM(CASE WHEN GRADE = 3 THEN 1 ELSE 0 END) AS GRADE3
FROM Rodzaj
GROUP BY NAME

所以我想我会有一种方法可以调整它,但我想知道是否还有另一种方法,或者这是最有效的方法吗? 我可能在想,如果 while 循环每次只输出一个特定的名称和日期以及计数,那么第一个结果将是 A,01/01/2012,1 然后是下一个 A,02/01/2012, 2 - A,03/01/2012,3 - B,01/01/2012,2 等等 那么也许可以通过不同的技术来实现,但不确定这样的事情是否可行以及是否有效。

所以我基本上是想看看是否有人对此有任何想法,以及他们将如何比较。

我希望我对所有内容的解释都足够好,在此先感谢您的帮助。

最佳答案

您必须在 GROUP BY 中包含两列:

SELECT   name, COUNT(*) AS count
FROM     your_table
GROUP BY name, date

这将以行格式获取每个名称 -> 日期组合的计数。如果名称在特定日期没有任何行,您还想包括 0 计数,因此您可以使用:

SELECT     a.name,
           b.date,
           COUNT(c.name) AS date_count
FROM       (SELECT DISTINCT name FROM your_table) a
CROSS JOIN (SELECT DISTINCT date FROM your_table) b
LEFT JOIN  your_table c ON a.name = c.name AND 
                           b.date = c.date
GROUP BY   a.name, 
           b.date

SQLFiddle Demo

关于mysql - 计算日期相等但按名称分隔的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811310/

相关文章:

php - MYSQL 输出 - HTML 表

mysql - 来自同一个表的连接计数

java - 从循环线程返回多个值而不用Java杀死它

php - 通过php连接数据库

mysql - 使用子选择的MySQL查询需要使用联接或存在

mysql - 如果表中的列太多,是否会降低性能?

mysql - 从 PhpStorm 中的文件(csv、sql)向 MySQL 插入数据

MySQL在函数中使用表列来创建用于排序的别名

mysql - MySQL中如何对子查询求和

mysql - SQL 分组项的最大平均值