0

我目前有一张桌子如下,

Column      Type
time        datetime             
ticket      int(20)              
agentid     int(20)              
ExitStatus  varchar(50)      
Queue       varchar(50)

我想编写一个查询,它将按周分解,为每个 ExitStatus 提供一个计数列。到目前为止,我有这个,

SELECT ExitStatus,COUNT(ExitStatus) AS ExitStatusCount, DAY(time) AS TimePeriod 
FROM `table` 
GROUP BY TimePeriod, ExitStatus

输出:

ExitStatus ExitStatusCount TimePeriod
NoAgentID                1          4 
Success                  3          4
NoAgentID                1          5
Success                  5          5

我想更改它,以便它以这种格式返回结果:

week | COUNT(NoAgentID) | COUNT(Success) | 

理想情况下,我希望列是动态的,因为其他 ExitStatus 值可能是可能的。

此信息将被格式化并在页面上的表格中呈现给最终用户。这可以用 SQL 完成还是应该用 PHP 重新格式化?

4

3 回答 3

0

这是一种方式;您可以使用SUM()来计算特定条件为真的项目数。最后,您只需按正常时间分组。

SELECT DAY(time) AS TimePeriod, 
  SUM('NoAgentID' = exitStatus) AS NoAgentID, 
  SUM('Success' = exitStatus) AS Success, ...
FROM `table` 
GROUP BY TimePeriod

输出:

4 1 3
5 1 5

不过,这里的列不是动态的,这意味着您必须在进行时添加条件。

于 2012-06-05T02:24:16.237 回答
0
SELECT week(time) AS week,
        SUM(ExitStatus = 'NoAgentID') AS 'COUNT(NoAgentID)',
        SUM(ExitStatus = 'Success') AS 'COUNT(Success)'
FROM `table`
GROUP BY week

我正在猜测 ExitStatus 列的工作原理。此外,还有许多解释“周”的方法,例如一年中的一周、一个月或季度……您需要将适当的函数放在那里。

于 2012-06-05T02:24:48.817 回答
0

没有可以通过单个查询来解决您的问题(称为交叉制表)的“通用”解决方案。有四种可能的解决方案:

  • 在您的查询中硬编码所有可能ExitStatus的 'es,并在您看到对它们越来越多的需求时保持更新。例如:
选择
    日(时间)AS TimePeriod,
    SUM(IF(ExitStatus = 'NoAgentID', 1, 0)) 作为 NoAgentID,
    SUM(IF(ExitStatus = 'Success', 1, 0)) 作为成功
    -- #TODO:在需要时/如果需要在此处添加其他人
从表
在哪里 ...
按时间段分组
  • 执行第一个查询以获取所有可能ExitStatus的 'es,然后根据这些结果从您的高级编程语言创建最终查询。

  • 在您的高级编程语言上使用特殊模块进行交叉制表。对于 Perl,您有SQLCrossTab 模块,但我找不到用于 PHP的模块

  • 通过使用像Pentaho这样的 OLAP(数据的多维视图)向您的应用程序添加另一层,然后查询该层而不是原始数据

您可以阅读有关这些解决方案的更多信息以及对该主题的整体讨论

于 2012-06-05T02:31:13.847 回答