2013-02-04 46 views
1

我已经阅读了近十几个类似的网站问题,但我不认为我的具体案例覆盖了任何地方。我不是一个dba,这仅仅是我自愿提供的一个支持项目,因为我知道更多的SQL比其他任何人都多,所以如果有人告诉我这个查询是一场灾难,我不会认真对待它。 :-)加入两个具有重叠值的sql查询以添加第三列

这是我的查询:

SELECT COUNT(a.issue_type_id) as DistinctIssues, b.issue_type_name, c.subissue_type_name, null AS DistinctTickets 
FROM [somedb].[dbo].[wh_task] AS a 
INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id 
INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id 
WHERE a.[create_time] between '11/01/12' AND '01/31/13' 
AND a.[account_id] = 123456 
AND a.[account_contact_id] is not null 
GROUP BY b.issue_type_name, c.subissue_type_name 
UNION 
SELECT null as DistinctIssues, b.issue_type_name, c.subissue_type_name, COUNT(a.issue_type_id) as DistinctTickets 
FROM [somedb].[dbo].[wh_task] AS a 
INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id 
INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id 
WHERE a.[create_time] between '11/01/12' AND '01/31/13' 
AND a.[account_id] = 123456 
GROUP BY b.issue_type_name, c.subissue_type_name 

而结果是这样的。

DistinctIssues issue_type_name subissue_type_name DistinctTickets 
NULL   Storage   EMC     45 
NULL   Storage   HP     2 
NULL   Symantec   Anti Virus   1 
NULL   Symantec   Backup Exec   4 
NULL   Virtualization Environmental  1 
NULL   Virtualization Network    5 
1    Microsoft   Server 2003   NULL 
1    Microsoft   Windows 7   NULL 
1    Network   Performance   NULL 
1    Virtualization Environmental  NULL 
2    Exchange   Database    NULL 

我敢打赌,你可以猜出我想从这里做什么。 我按照两种问题类型进行分组,并且我希望所有门票的计数以及这些门票的子集计数。我的数据库是MS SQL服务器(2008,我相信)。我只有访问意见,为什么值得。

+0

我读过后几次,我不确定你想要做什么。您提供了查询的输出,但有帮助的是显示您希望退出查询的输出。此外,它看起来像您的顶级查询是您的底部查询的子集;这是故意的吗?它看起来像顶部查询将具有与底部查询相同的结果减去具有空值Account_Contact_ID值的记录。我仍然不确定我是否理解这里的目的。 –

+0

对不起,我会尽量在将来更加清晰,并且我还会包含所需的结果。 – AlsoKnownAsJazz

回答

1

这两个查询按照相同的标准连接相同的表,将结果按相同的标准分组,甚至统计相同的列。唯一的区别似乎是其中一个查询在WHERE子句中使用了附加条件。

在这种情况下,你可以将它们组合成一个单一的查询,使用条件聚集由查询与附加条件(DistinctIssues)的返回值:

SELECT 
    COUNT(CASE WHEN a.[account_contact_id] is not null THEN a.issue_type_id END) as DistinctIssues, 
    b.issue_type_name, 
    c.subissue_type_name, 
    COUNT(a.issue_type_id) as DistinctTickets 
FROM [somedb].[dbo].[wh_task] AS a 
INNER JOIN [somedb].[dbo].[wh_issue_type] AS b 
    ON a.issue_type_id = b.issue_type_id 
INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c 
    ON a.subissue_type_id = c.subissue_type_id 
WHERE a.[create_time] between '11/01/12' AND '01/31/13' 
    AND a.[account_id] = 123456 
GROUP BY b.issue_type_name, c.subissue_type_name 
; 
+0

太棒了,非常感谢!我在查询中做了一个查询,但它只是躲过了我。这完全符合我的需要。 – AlsoKnownAsJazz

0

这是一个有点艰难的就一定要做到这一点有一点遗漏信息的最佳方式 - 你的意思是这样的:

WITH Issues AS 
(
    SELECT COUNT(a.issue_type_id) as DistinctIssues, b.issue_type_name, c.subissue_type_name 
    FROM [somedb].[dbo].[wh_task] AS a 
    INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id 
    INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id 
    WHERE a.[create_time] between '11/01/12' AND '01/31/13' 
    AND a.[account_id] = 123456 
    AND a.[account_contact_id] is not null 
    GROUP BY b.issue_type_name, c.subissue_type_name 
), 
Tickets AS 
(
    SELECT b.issue_type_name, c.subissue_type_name, COUNT(a.issue_type_id) as DistinctTickets 
    FROM [somedb].[dbo].[wh_task] AS a 
    INNER JOIN [somedb].[dbo].[wh_issue_type] AS b ON a.issue_type_id = b.issue_type_id 
    INNER JOIN [somedb].[dbo].[wh_subissue_type] AS c ON a.subissue_type_id = c.subissue_type_id 
    WHERE a.[create_time] between '11/01/12' AND '01/31/13' 
    AND a.[account_id] = 123456 
    GROUP BY b.issue_type_name, c.subissue_type_name 
) 
SELECT i.DistinctIssues 
    , COALESCE(i.issue_type_name, t.issue_type_name) AS issue_type_name 
    , COALESCE(i.subissue_type_name, t.subissue_type_name) AS subissue_type_name 
    , t.DistinctTickets 
FROM Issues i 
    FULL JOIN Tickets t ON i.issue_type_name = i.issue_type_name 
    AND i.subissue_type_name = t.subissue_type_name 

这给了这两个问题,并门票存在每个组合。

如果这不是必需的,也许你也可以提供一个样本数据集和你想要的输出?