每个日期/时间具有多个组的 MySQL 查询计数

Posted

技术标签:

【中文标题】每个日期/时间具有多个组的 MySQL 查询计数【英文标题】:MySQL Query count with multiple group per date/time 【发布时间】:2015-04-30 12:51:33 【问题描述】:

mysql 表中有以下数据:

+-------------------------------------+-----------------+
|            DATE                     | SipResponseCode |
+-------------------------------------+-----------------+
| 20 Feb                              |             200 |
| 20 Feb                              |             500 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             487 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             500 |
| 20 Feb                              |             500 |
| 20 Feb                              |             487 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             500 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             200 |
| 20 Feb                              |             500 |
| 21 Feb                              |             200 |
| 21 Feb                              |             487 |
| 21 Feb                              |             200 |
| 21 Feb                              |             487 |
| 21 Feb                              |             487 |
| 21 Feb                              |             487 |
| 21 Feb                              |             487 |
| 21 Feb                              |             200 |
| 21 Feb                              |             200 |
| 21 Feb                              |             487 |
| 21 Feb                              |             487 |
| 21 Feb                              |             500 |

我想编写 SQL 查询,这样它就可以给我每天的 SipResponseCode 计数 200487500

+-------------------------------------+------------+-----------+--------+
|            DATE                     |    200     |    487    |   500  |
+-------------------------------------+------------+--------------------+
| 20 Feb                              |     14     |      2    |    5   |
| 21 Feb                              |     4      |      7    |    1   | 

我很累,但无法得到正确的结果。

【问题讨论】:

@Strawberry 我不是SQL expert 伙计,加油!来这里寻求帮助..我需要专家才能提出问题吗? 值 200、487 和 500 是否一致?这些价值观是你提前知道的吗? @McAdam331 是的,这些值是固定的,还有更多的 SipResponsecode 502,403,408 等。但是一旦我知道如何将它们组合在一起,我将设法调整它们 @Strawberry 我不认为这种态度对 *** 有帮助。这应该是人们在需要时寻求帮助的地方,而不必担心因不知道而被贬低。 @Strawberry 我擅长 Linux 系统管理员,但不是开发人员(SQL 编写者),只是被困在这里,所以认为你们会提供帮助,但看起来你 down 已经投票了......非常失望:( 【参考方案1】:

标准答案大致如下:

SELECT date
     , sipresponsecode
     , COUNT(sipresponsecode) x 
  FROM my_table 
 GROUP 
    BY date
     , sipresponsecode;

【讨论】:

【参考方案2】:

以下查询将为您提供结果,不是您想要的,而是以一种简单的方式稍后用您的语言(php、C# 等)解析它。

SELECT  DATE, GROUP_CONCAT(CAST(TEST AS CHAR(10000) CHARACTER SET utf8) SEPARATOR ",") AS myCol
FROM
(
    SELECT      DATE, CONCAT(SipResponseCode, "^",  COUNT(*)) AS TEST
    FROM        table1
    GROUP BY    DATE, SipResponseCode
) a
GROUP BY DATE

【讨论】:

【参考方案3】:

如果值 200、487 和 500 是您在编写查询时知道的常量值,则可以在 select 子句的 case 语句中使用这些值。

比 case 语句更易读的方法是使用带有条件的 SUM() 函数,它本质上将计算满足该条件的行数。试试这个:

SELECT dateColumn, 
   SUM(SisResponseCode = 200) AS '200', 
   SUM(SisResponseCode = 487) AS '487', 
   SUM(SisResponseCode = 500) AS '500'
FROM myTable
GROUP BY dateColumn;

【讨论】:

以上是关于每个日期/时间具有多个组的 MySQL 查询计数的主要内容,如果未能解决你的问题,请参考以下文章

按组的每个出现值构建计数列

Sql获取连续日期的计数

固定日期范围之间的 MySQL 记录

请求有关如何在一个查询中对多个条件的计数进行分组的帮助

每个月内选择 DISTINCT 计数条​​目。 MYSQL

MYSQL 多个条件语句进行计数