我现在有一张表如下,
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中重新格式化?
答案 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