2016-06-24 108 views
1

我无法从SQL Server 2008查询中获取所需的结果。查询1为[GeneralErrors]生成我想要的结果,查询2为[RehabErrors]生成正确的结果,但我真的需要它们在同一行上。当我在查询3中尝试并结合这两个查询时,[GeneralErrors]的结果不正确,但是我要去查表的方式。SQL Server 2008查询 - 表连接

查询1:

SELECT 
     ReviewID, 
     SUM(CASE Score_CorrectID_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_ProperlyIdentified_Accuracy WHEN 'Error' THEN 1 ELSE 0 END) AS GeneralErrors 
    FROM 
     Reviews 
    WHERE 
     (UserID IS NOT NULL AND UserID <> '') 
    GROUP BY 
     Reviews.ReviewID 

Results: 

ReviewID GeneralErrors 
7   0 
8   0 
9   0 
10   0 
11   0 
12   9 
13   0 
14   0 
15   4 

问题2:

SELECT 
     Reviews.ReviewID 
     ,COUNT(RehabMetricsCalls.ReviewID) AS RehabErrors 
    FROM RehabMetrics INNER JOIN 
      RehabMetricsCalls ON RehabMetrics.RehabMetricID = RehabMetricsCalls.RehabMetricID RIGHT OUTER JOIN 
      Reviews ON RehabMetricsCalls.ReviewID = Reviews.ReviewID 
    WHERE 
     (UserID IS NOT NULL AND UserID <> '') 
    GROUP BY 
     Reviews.ReviewID 

Results: 

ReviewID RehabErrors 
7   3 
8   0 
9   0 
10   0 
11   0 
12   5 
13   5 
14   0 
15   4 

问题3: 我在两个查询相结合的尝试,其产生不正确的结果

SELECT DISTINCT 
     Reviews.ReviewID 
     ,SUM(CASE Score_CorrectID_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_ProperlyIdentified_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_MiniMiranda_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_Tone_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_Accuracy_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_Notepad_Accuracy WHEN 'Error' THEN 1 ELSE 0 END +   
     CASE Score_PCAResponsive_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Score_AWGInfo_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
     CASE Complaint_Accuracy WHEN 'Error' THEN 1 ELSE 0 END) AS GeneralErrors 
     ,COUNT(RehabMetricsCalls.ReviewID) AS RehabErrors 
    FROM RehabMetrics INNER JOIN 
      RehabMetricsCalls ON RehabMetrics.RehabMetricID = RehabMetricsCalls.RehabMetricID INNER JOIN 
      Reviews ON RehabMetricsCalls.ReviewID = Reviews.ReviewID 
    WHERE 
     (UserID IS NOT NULL AND UserID <> '') 
    GROUP BY 
     Reviews.ReviewID 

期望的结果:

ReviewID GeneralErrors RehabErrors 
    7   0    3 
    12   45    5 
    13   0    5 
    15   16    4 
+0

,在所有的情况下,这是第3查询长总和,它是第一个查询不同。你为什么期望得到相同的结果?你可能想使用COUNT(DISTINCT RehabMetricsCalls.RehabMetricID)来修复错误? – LukStorms

+0

顺便说一句,要在第3个查询中获得所有相同的ReviewId,您必须从评论中选择,然后将其加入其他2个表中。 – LukStorms

回答

0

做一个加盟..

;with Firstquery as 
(
SELECT 
ReviewID, 
SUM(CASE Score_CorrectID_Accuracy WHEN 'Error' THEN 1 ELSE 0 END + 
CASE Score_ProperlyIdentified_Accuracy WHEN 'Error' THEN 1 ELSE 0 END) AS GeneralErrors 
FROM 
Reviews 
WHERE 
(UserID IS NOT NULL AND UserID <> '') 
GROUP BY 
Reviews.ReviewID 
) 
,Secondquery as 
(
SELECT 
    Reviews.ReviewID 
,COUNT(RehabMetricsCalls.ReviewID) AS RehabErrors 
FROM RehabMetrics INNER JOIN 
    RehabMetricsCalls ON RehabMetrics.RehabMetricID = RehabMetricsCalls.RehabMetricID RIGHT OUTER JOIN 
Reviews ON RehabMetricsCalls.ReviewID = Reviews.ReviewID 
WHERE 
(UserID IS NOT NULL AND UserID <> '') 
GROUP BY 
    Reviews.ReviewID 
) 
select 
fs.reviewid,fs.generalerrors,sq.rehaberrors 
from 
firstquery fs 
join 
secondquery sq 
on fs.reviewid=sq.reviewid 
+0

sq.generalerrors应该是sq.rehaberrors。非常感谢 – user3641053

+0

谢谢现在更新,这是打字时出错 – TheGameiswar