格式化MySQL查询结果

时间:2012-06-05 02:12:56

标签: mysql

我现在有一张表如下,

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中重新格式化?

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

SELECT week(time) AS week,
        SUM(ExitStatus = 'NoAgentID') AS 'COUNT(NoAgentID)',
        SUM(ExitStatus = 'Success') AS 'COUNT(Success)'
FROM `table`
GROUP BY week

我正在猜测ExitStatus列是如何工作的。此外,有很多方法可以解释“周”,例如一周,一个月或一个季度......,你需要在那里放置适当的功能。

答案 2 :(得分:0)

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

  • 在您的查询中对所有可能的ExitStatus进行硬编码,并在您看到越来越多的需求时对其进行更新。例如:
SELECT
    Day(Time) AS TimePeriod,
    SUM(IF(ExitStatus = 'NoAgentID', 1, 0)) AS NoAgentID,
    SUM(IF(ExitStatus = 'Success', 1, 0)) AS Success
    -- #TODO: Add others here when/if needed
FROM table
WHERE ...
GROUP BY TimePeriod
  • 执行第一个查询以获取所有可能的ExitStatus,然后根据这些结果从您的高级编程语言创建最终查询。

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

  • 使用OLAP(数据的多维视图)(例如Pentaho)向应用程序添加另一个图层,然后查询该图层而不是原始数据

You can read a lot more about these solutions and an overall discussion of the subject