2016-06-24 18 views
1

Ich habe Probleme, die Ergebnisse, die ich von einer SQL Server 2008-Abfrage erhalten möchte. Abfrage 1 erzeugt die Ergebnisse, die ich für [GeneralErrors] haben möchte, und Abfrage 2 erzeugt die korrekten Ergebnisse für [RehabErrors], aber ich brauche sie wirklich beide in derselben Zeile. Wenn ich versuche, die zwei Abfragen in Abfrage 3 zu kombinieren, sind meine Ergebnisse für [GeneralErrors] falsch, aber die Art, wie ich die Tabellen gehe.SQL Server 2008-Abfrage - Tabellenverknüpfung

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 

Abfrage 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 

Abfrage 3: Mein Versuch, die beiden Abfragen kombiniert, die zu falschen Ergebnissen

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 

gewünschten Ergebnisse produziert:

+0

Die lange Summe in der 3. Abfrage mit dem ganzen Fall ist es von der ersten Abfrage anders. Warum sollten Sie dieselben Ergebnisse erwarten? Und Sie könnten ein 'COUNT (DISTINCT RehabMetricsCalls.RehabMetricID)' für RehabErrors verwenden? – LukStorms

+0

Btw, um die gleichen ReviewId's in der dritten Abfrage zu bekommen, müssten Sie aus Bewertungen auswählen und dann links die anderen 2 Tabellen beitreten. – LukStorms

Antwort

0

treten ein ..

;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 sollte sq.rehaberrors sein. Vielen Dank – user3641053

+0

Danke Jetzt aktualisiert, das ist ein Fehler beim Tippen – TheGameiswar

Verwandte Themen