SQL计数与左联接

时间:2018-10-11 16:34:30

标签: sql-server

在我的Microsoft SQL Server 2016数据库上,我试图确定去年有多少个实验室(Lab_Space表)进行了评估(EHS_Assessment_Audit表),并按位置({ {1}}表)。每个实验室每年进行一次以上的评估是很常见的。

到目前为止,我尝试过的所有结果都比实验室获得更多的“完成”计数。例如:

Locations

那里的CTE应该为我提供一个已经完成评估的实验室的唯一列表,然后我试图按位置将其分组。我最终得到的输出结果是,单个站点/校园组合的总输出为178,审计的为1080。

1 个答案:

答案 0 :(得分:0)

我认为,在这种情况下使用CTE将会带来更多的麻烦,而不是值得的。子查询将更易于阅读和修改。例如:

SELECT 
    l.Site_Name, 
    l.Campus_Name, 
    COALESCE(b.NumAudits, 0) as NumTotalAudits, 
    COALESCE(b.NumLabs, 0) as AuditedLabs
FROM Locations l
LEFT JOIN (
    SELECT s.Building_Code, COUNT(*) as NumAudits, COUNT(DISTINCT s.Lab_Space_Id) as NumLabs
    FROM Lab_Space s
    INNER JOIN EHS_Assessment_Audit a ON s.Lab_Space_Id = a.Lab_Space_Id
    WHERE a.Audit_Date >= DATEADD(year, -1, GETDATE())
    GROUP BY s.Building_Code
) as b ON l.Building_Code = b.Building_Code

过于简单的临时表和示例数据:

CREATE TABLE #EHS_Assessment_Audit (Lab_Space_Id int, Audit_Date datetime)
CREATE TABLE #Lab_Space (Lab_Space_Id int, Building_Code int)
CREATE TABLE #Locations (Location_Id int, Building_Code int, Site_Name nvarchar(30), Campus_Name nvarchar(30))

INSERT INTO #Locations VALUES (1, 1, 'Location1', 'Campus1'), (2, 2, 'Location2', 'Campus2')
INSERT INTO #Lab_Space VALUES (1, 1), (2, 1), (3, 2), (4, 2)
INSERT INTO #EHS_Assessment_Audit VALUES (1, '2018-10-11'), (1, '2018-09-11'), (2, '2018-10-11'), (3, '2015-10-11')

SELECT * FROM #Locations
SELECT * FROM #Lab_Space
SELECT * FROM #EHS_Assessment_Audit

SELECT 
    l.Site_Name, 
    l.Campus_Name, 
    COALESCE(b.NumAudits, 0) as NumTotalAudits, 
    COALESCE(b.NumLabs, 0) as AuditedLabs
FROM #Locations l
LEFT JOIN (
    SELECT s.Building_Code, COUNT(*) as NumAudits, COUNT(DISTINCT s.Lab_Space_Id) as NumLabs
    FROM #Lab_Space s
    INNER JOIN #EHS_Assessment_Audit a ON s.Lab_Space_Id = a.Lab_Space_Id
    WHERE a.Audit_Date >= DATEADD(year, -1, GETDATE())
    GROUP BY s.Building_Code
) as b ON l.Building_Code = b.Building_Code