2016-06-24 4 views
1

У меня возникли проблемы с получением результатов, которые я хочу получить из запроса SQL Server 2008. Запрос 1 дает результаты, которые я хочу для [GeneralErrors], а Query 2 дает правильные результаты для [RehabErrors], но мне действительно нужны они оба в одной строке. Когда я пытаюсь объединить два запроса в Query 3, мои результаты для [GeneralErrors] неверны, но в том, как я иду по таблицам.SQL Server 2008 Query - join join

Query1:

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)' для RehabErrors? – LukStorms

+0

Btw, чтобы получить все тот же ReviewId's в 3-м запросе, который вам нужно будет выбрать из Обзоров, а затем присоединиться к двум другим таблицам. – 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