2015-05-25 144 views
4

我是新来的SQL,我目前正在尝试学习如何在Visual Studio中创建报表。我需要制作一张桌子,图表和其他一些东西。我决定做矩阵作为最后一部分,现在我卡住了。我在SQL Server中编写我的查询。如何将两个SQL查询合并为一个?

我有两个表:工作人员(empID,StaffLevel,姓氏)和WorkOfArt(artID,名称,策展人,helpsCurator)。在Curator和HelpingCurator的专栏中,我使用了empID中的数字。

我希望我的矩阵能够显示每个empID和他们充当策展人的绘画数量以及他们充当帮助策展人的绘画数量(所以我需要三列:empID, 。COUNT(馆长),计数(helpingCurator)

Select Staff.empID, count(WorkOfArt.Curator) as CuratorTotal 
FROM Staff, WorkOfArt 
WHERE Staff.empID=WorkOfArt.Curator 
and Staff.StaffLevel<7 
group by Staff.empID; 

Select Staff.empID, count(WorkOfArt.HelpingCurator) as HelpingCuratorTotal 
FROM Staff, WorkOfArt 
WHERE Staff.empID=WorkOfArt.HelpingCurator 
and Staff.StaffLevel<7 
group by Staff.empID; 

我创建了这两个查询和他们的工作完全正常,但我需要它在一个查询

我想:

Select Staff.empID, count(WorkOfArt.Curator) as CuratorTotal, 
COUNT(WorkOfArt.HelpingCurator) as HelpingCuratorTotal 
FROM Staff FULL OUTER JOIN WorkOfArt on Staff.empID=WorkOfArt.Curator 
and Staff.empID=WorkOfArt.HelpingCurator 
WHERE Staff.StaffLevel<7 
group by Staff.empID; 

(以及使用左或右外连接) - 这个人给我EMPID表,但在这两个数列只有0 - 和:

Select Staff.empID, count(WorkOfArt.Curator) as CuratorTotal, 
COUNT(WorkOfArt.HelpingCurator) as HelpingCuratorTotal 
FROM Staff, WorkOfArt 
WHERE Staff.empID=WorkOfArt.Curator 
and Staff.empID=WorkOfArt.HelpingCurator 
and Staff.StaffLevel<7 
group by Staff.empID; 

而这一次给我公正的名字的列。

我不知道下一步该怎么做。我试图在谷歌中找到答案,但是我发现的所有解释对我来说都更为先进,所以我无法理解它们......请帮助我吗?提示也很好。

回答

4

做到这一点,最简单的方法是最有可能与内选择SELECT子句中,像这样的东西:

Select 
    S.empID, 
    (select count(*) from WorkOfArt C where C.Curator = S.empID) 
    as CuratorTotal, 
    (select count(*) from WorkOfArt H where H.HelpingCurator = S.empID) 
    as HelpingCuratorTotal 
FROM Staff S 
WHERE S.StaffLevel<7 
group by S.empID; 

这种方式与不同的角色的行不会导致与计算题。如果这些表格非常大或者您有许多不同的角色,那么在WorkOfArt表中首先对项目进行分组的最可能更复杂的查询可能会具有更好的性能,因为这需要两次读取行。

+0

非常非常感谢!这就像我想要的一样!谢谢! – Koralkea

+0

这不需要您的“内部选择”为每个返回运行?我认为内联表会更高效。 – amcdermott

+0

@amcdermott。 。 。表现应该很好,特别是如果两个策展人栏目上有索引。 –

1

从性能角度看,下面的查询可能是一个小更高效

select e.EmpId, CuratorForCount, HelpingCuratorForCount 
    from Staff s 
inner join (select Curator, count(*) as CuratorForCount 
       from WorkOfArt 
       group by Curator) mainCurator on s.EmpId = mainCurator.Curator 
inner join (select HelpingCurator, count(*) as HelpingCuratorForCount 
       from WorkOfArt 
       group by HelpingCurator) secondaryCurator on s.EmpId = secondaryCurator.HelpingCurator 
+0

这可能比我的例子更快,这取决于当然的数据,但对于刚学SQL的人来说,理解起来也有点复杂。 –

1

一种方法,如果你想获得多个值合计值从WorkOfArt表是预先可以是有益的 - 汇总结果:

Select s.empID, COALESCE(woac.cnt, 0) as CuratorTotal, 
     COALESCE(woahc.cnt) as HelpingCuratorTotal 
FROM Staff s LEFT JOIN 
    (SELECT woa.Curator, COUNT(*) as cnt 
     FROM WorkOfArt woa 
     GROUP BY woa.Curator 
    ) woac 
    ON s.empID = woac.Curator LEFT JOIN 
    (SELECT woa.HelpingCurator, COUNT(*) as cnt 
     FROM WorkOfArt woa 
     GROUP BY woa.HelpingCurator 
    ) woahc 
    ON s.empID = woahc.HelpingCurator 
WHERE s.StaffLevel < 7; 

请注意,外层的聚合是不需要的。

+0

您能否解释一下“COALESCE”实际上做了什么? – Koralkea

+0

@Koralkea。 。 。 https://msdn.microsoft.com/en-us/library/ms190349.aspx。 –