繁体   English   中英

SQL查询合并来自不同表的报告

[英]SQL query combine report from different tables

我有支持票证数据库,它们分为两个表,如IncidentsTasks
Incidents有田assigned_groupopen_timeclose_time
Tasks具有字段assignmentissue_dateclose_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_groupassignment对联接有效)? 如果是这样,则以下子选项将返回未解决事件的总数

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM