[英]SQL query combine report from different tables
我有支持票证数据库,它们分为两个表,如Incidents
, Tasks
。
Incidents
有田assigned_group
, open_time
, close_time
Tasks
具有字段assignment
, issue_date
, close_date
(含义相同,但名称不同)
现在,我需要针对特定时间段编写以下结构的报告:
Group | Total opened incidents + tasks | Total closed incidents + tasks)
单个查询如下所示:
-- Q1: Total opened incidents
SELECT assigned_group, COUNT(*) FROM incidents WHERE open_time BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' GROUP BY assigned_group
-- Q2: Total closed incidents
SELECT assigned_group, COUNT(*) FROM incidents WHERE close_time BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' GROUP BY assigned_group
-- Q3: Total opened tasks
SELECT assignment, COUNT(*) FROM tasks WHERE issue_date BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' GROUP BY assignment
-- Q4: Total closed tasks
SELECT assignment, COUNT(*) FROM tasks WHERE close_date BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' GROUP BY assignment
结果表应为
Group | Q1+Q3 | Q2+Q4
请注意,在每个查询中,行(组)的数量可以不同,例如,在特定时间段内没有打开任何任务,但是关闭了一些任务,这仍应计算在内
谢谢!
我是否正确地认为要获得Q1和Q3的总未解决事件和任务的总和(假设assigned_group
和assignment
对联接有效)? 如果是这样,则以下子选项将返回未解决事件的总数
SELECT Incidents.IncidentCount + Tasks.TaskCount AS TotalOpenIncidents ,
COALESCE(Incidents.assigned_group, Tasks.assignment) AS Group
FROM (
SELECT assigned_group, COUNT(*) AS IncidentCount
FROM incidents
WHERE open_time BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00'
GROUP BY assigned_group ) AS Incidents INNER JOIN
(
SELECT assignment, COUNT(*) AS TaskCount
FROM tasks
WHERE issue_date BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00'
GROUP BY assignment) AS Tasks ON Incidents.assigned_group = Tasks.assignment
您需要对Q2和Q4进行相同的操作以获取关闭的数量
要将此类数据粘贴在一起,可以使用“完全外部联接”或UNION ALL
。 这是UNION ALL
方法:
有多种方法可以将该查询重构得更简单。 如果您有兴趣,我可以进一步介绍您,或者您可以自己尝试。 例如,您只需要Z子表中的2个查询。
如果您的联接列不是唯一的,则UNION ALL
方法将停止重复计数(尽管这对您来说不是问题)
SELECT assigned_group, SUM(Closed) As Closed, SUM(Opened) As Opened
FROM
(
SELECT assigned_group, COUNT(*) As Closed, 0 As Opened
FROM incidents
WHERE open_time BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00'
GROUP BY assigned_group
UNION ALL
SELECT assigned_group, 0 As Closed, COUNT(*) As Opened
FROM incidents
WHERE close_time BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00'
GROUP BY assigned_group
UNION ALL
SELECT assignment, 0 As Closed, COUNT(*) As Opened
FROM tasks
WHERE issue_date BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00'
GROUP BY assignment
UNION ALL
SELECT assignment, COUNT(*) As Closed, 0 As Opened
FROM tasks
WHERE close_date BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00'
GROUP BY assignment
) Z
GROUP BY assigned_group,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.