使用每个Select语句中的计数将多个选择语句组合成一个

时间:2014-12-03 08:39:24

标签: tsql

我有一个场景,其中联系人可以是所有者和/或建造者,或两者都不是。数据位于两个单独的表中,例如:

SELECT     Contacts.Id, count(Owners.Id) AS [Owner Count]
FROM       Contacts INNER JOIN Owners ON Contacts.Id = Owners.Id
GROUP BY   Contacts.Id, Owners.Id

SELECT     Contacts.Id, count(Builders.Id) AS [Builder Count]
FROM       Contacts INNER JOIN Builders ON Contacts.Id = Builders.Id
GROUP BY   Contacts.Id, Builders.Id

由于两个select语句都有共同的Contact.Id,我希望看到结果显示为:

Contact Id | Owner Count | Builder Count |
   3043    |     1       |       2       |
   4011    |     null    |       1       |
   4045    |     null    |       null    |
   5011    |     4       |       null    |

我尝试了一些变体,最接近的我是一个UNION,最终为每个Contact Id显示两行,一行为Owner,另一行为Builder,而不是组合成一行。 / p>

提前致谢!

2 个答案:

答案 0 :(得分:0)

使用Left Outer Join

Select a.Id, b.[Owner Count], c.[Builder Count]
From
(
    SELECT Id From Contacts
)a Left Outer Join 
(
    SELECT     Contacts.Id, count(Owners.Id) AS [Owner Count]
    FROM       Contacts INNER JOIN Owners ON Contacts.Id = Owners.Id
    GROUP BY   Contacts.Id, Owners.Id
) b On a.Id = b.Id Left Outer Join 
(
    SELECT     Contacts.Id, count(Builders.Id) AS [Builder Count]
    FROM       Contacts INNER JOIN Builders ON Contacts.Id = Builders.Id
    GROUP BY   Contacts.Id, Builders.Id
) c on a.Id = c.Id

答案 1 :(得分:0)

您可以实现LEFT JOINOwnersBuilders

Contacts所需的工作
SELECT Contacts.Id,
    count(Owners.Id) AS [Owner Count],
    count(Builders.Id) AS [Builder Count]
FROM Contacts
    LEFT JOIN Owners ON Contacts.Id = Owners.Id
    LEFT JOIN Builders ON Contacts.Id = Builders.Id
GROUP BY Contacts.Id