2016-11-09 1 views
1

Dies ist rätselhaft mich, und ich weiß, es könnte schwierig sein, ohne die Daten, aber dachte, es wäre eine Longshot, hier zu posten.Warum gibt es einen Unterschied in meiner SQL-Ausgabe

geht hier der erste Code, den ich erhielt, war dieses

USE [Radiotherapy] 
GO 

if exists (
    select * from tempdb.dbo.sysobjects o 
    where o.xtype in ('U') 

    and o.id = object_id(N'tempdb..#MySampleTemp') 
) 
DROP TABLE #MySampleTemp; 

if exists (
    select * from tempdb.dbo.sysobjects o 
    where o.xtype in ('U') 

    and o.id = object_id(N'tempdb..#MyPivotTemp') 
) 
DROP TABLE #MyPivotTemp; 

SELECT [AttendanceNumber] 
     ,CASE WHEN AgeAtExamDate BETWEEN 0 AND 5 THEN '0-5' 
     WHEN AgeAtExamDate BETWEEN 6 AND 18 THEN '6-18' 
     WHEN AgeAtExamDate BETWEEN 19 AND 150 THEN '19+' 
     ELSE 'Error' END AS AgeRange 
     ,[LocalPatientIdentifier] 
     ,[ExaminationDate] 
     ,[ExamExaminationCode] INTO #MySampleTemp 
FROM [dbo].[tblRadiologyData] 
WHERE AttendanceSiteCode IN('CNM','RNM') 
--AND AttendanceStatus NOT IN ('Appt', 'Booked In', 'Cancelled', 'Pending') 
--AND AttendancePatientGroup = 'Out Patient' 
--AND AttendancePatientCategory IN ('EU', 'Military', 'N.H.S.') 
--AND AttendanceSourceName <> 'PACs Support' 
AND [ExaminationDate] >= '1 OCTOBER 2015' -- 

ORDER BY [AttendanceNumber], CASE WHEN AgeAtExamDate BETWEEN 0 AND 5 THEN '0-5' 
     WHEN AgeAtExamDate BETWEEN 6 AND 18 THEN '6-18' 
     WHEN AgeAtExamDate BETWEEN 19 AND 150 THEN '19+' 
     ELSE 'Error' END, [LocalPatientIdentifier], [ExaminationDate], ExamExaminationCode 

SELECT [AttendanceNumber],AgeRange,[LocalPatientIdentifier],[ExaminationDate], 1 AS ExamCount, 
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14] INTO #MyPivotTemp 
FROM 
(
    SELECT *, 
    row_number() OVER(PARTITION BY [AttendanceNumber] 
    ORDER BY [AttendanceNumber], [LocalPatientIdentifier]) rn 
    FROM #MySampleTemp 
) AS st 
pivot 
(
    MAX(ExamExaminationCode) 
    FOR rn in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14]) 
) AS pivottable 

SELECT 
[1] AS Exam01, 
[2] AS Exam02, 
[3] AS Exam03, 
[4] AS Exam04, 
[5] AS Exam05, 
[6] AS Exam06, 
[7] AS Exam07, 
[8] AS Exam08, 
[9] AS Exam09, 
[10] AS Exam10, 
[11] AS Exam11, 
[12] AS Exam12, 
[13] AS Exam13, 
[14] AS Exam14, 
COUNT(ExamCount) AS [No. Attendances] 
FROM #MyPivotTemp 
GROUP BY [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14] 
ORDER BY [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14] 

Was ich versucht, dies in Abfrage zu tun war zu replizieren wie folgt:

USE [Strahlentherapie]

;With CTE AS (SELECT s.attendanceNumber, 
     MAX(CASE WHEN s.rnk = 1 THEN s.ExamExaminationCode END) as examCode1, 
     MAX(CASE WHEN s.rnk = 2 THEN s.ExamExaminationCode END) as examCode2, 
     MAX(CASE WHEN s.rnk = 3 THEN s.ExamExaminationCode END) as examCode3, 
     MAX(CASE WHEN s.rnk = 4 THEN s.ExamExaminationCode END) as examCode4, 
     MAX(CASE WHEN s.rnk = 5 THEN s.ExamExaminationCode END) as examCode5, 
     MAX(CASE WHEN s.rnk = 6 THEN s.ExamExaminationCode END) as examCode6, 
     MAX(CASE WHEN s.rnk = 7 THEN s.ExamExaminationCode END) as examCode7, 
     MAX(CASE WHEN s.rnk = 8 THEN s.ExamExaminationCode END) as examCode8, 
     MAX(CASE WHEN s.rnk = 9 THEN s.ExamExaminationCode END) as examCode9, 
     MAX(CASE WHEN s.rnk = 10 THEN s.ExamExaminationCode END) as examCode10, 
     MAX(CASE WHEN s.rnk = 11 THEN s.ExamExaminationCode END) as examCode11, 
     MAX(CASE WHEN s.rnk = 12 THEN s.ExamExaminationCode END) as examCode12, 
     MAX(CASE WHEN s.rnk = 13 THEN s.ExamExaminationCode END) as examCode13, 
     MAX(CASE WHEN s.rnk = 14 THEN s.ExamExaminationCode END) as examCode14 
FROM (
    SELECT [AttendanceNumber] 
      ,[ExaminationDate] 
      ,[ExamExaminationCode] 
      ,ROW_NUMBER() OVER(PARTITION BY [AttendanceNumber] 
      ORDER BY [RadiologyID]) as rnk --Ordered by date ASC 

     FROM [Radiotherapy].[dbo].[tblRadiologyData] rd 
     where rd.ExaminationDate >= '01 october 2015' 
     and rd.AttendanceSiteCode IN('CNM','RNM')) s 
GROUP BY s.attendanceNumber) 

Select CTE.examCode1, 
     CTE.examCode2, 
     CTE.examCode3, 
     CTE.examCode4, 
     CTE.examCode5, 
     CTE.examCode6, 
     CTE.examCode7, 
     CTE.examCode8, 
     CTE.examCode9, 
     CTE.examCode10, 
     CTE.examCode11, 
     CTE.examCode12, 
     CTE.examCode13, 
     CTE.examCode14, 
     COUNT(CTE.AttendanceNumber) as [No of occurances] 
from CTE 
GROUP by CTE.examCode1, 
     CTE.examCode2, 
     CTE.examCode3, 
     CTE.examCode4, 
     CTE.examCode5, 
     CTE.examCode6, 
     CTE.examCode7, 
     CTE.examCode8, 
     CTE.examCode9, 
     CTE.examCode10, 
     CTE.examCode11, 
     CTE.examCode12, 
     CTE.examCode13, 
     CTE.examCode14 

ORDER BY CTE.examCode1 

Groß Ich dachte, bis mein Code mehr Ergebnisse zurück brachte, die mich verwirrten. Nachdem es aufgeschlüsselt fand ich den fehlerhaften Code aus der ursprünglichen Abfrage:

ORDER BY [AttendanceNumber], CASE WHEN AgeAtExamDate BETWEEN 0 AND 5 THEN '0-5' 
     WHEN AgeAtExamDate BETWEEN 6 AND 18 THEN '6-18' 
     WHEN AgeAtExamDate BETWEEN 19 AND 150 THEN '19+' 
     ELSE 'Error' END, [LocalPatientIdentifier], [ExaminationDate], ExamExaminationCode 

Als ich das von der ersten Abfrage entfernt die Ergebnisse angepasst, aber meine Frage ist, wie und warum ein ORDER BY den Ausgang zu beeinflussen. Ich nahm an, dies zeigte nur, wie die Ergebnisse geordnet sind? Zu verstehen, warum Code tut, was er tut, ist etwas, das ich wirklich brauche, um mich zu verstehen. Irgendwelche Ratschläge mehr als willkommen.

+0

Unmöglich genau zu sagen, aber auf den ersten Blick sollte es nicht die Anzahl der Ergebnismenge ändern. –

+0

aber es tut, ich habe es gerade noch einmal ausgeführt, zuerst mit dem ORDER BY Bit, das 300 Ergebnisse zurückgibt, dann entfernte ich es und nur 71 Ergebnisse, deshalb bin ich verblüfft! – Simon

Antwort

1

Wahrscheinlich haben sie etwas mit diesem Stück Code zu tun:

SELECT *, 
     row_number() OVER(PARTITION BY [AttendanceNumber] 
ORDER BY [AttendanceNumber], [LocalPatientIdentifier]) rn 
FROM #MySampleTemp 

Offensichtlich Ihre Bestellung zu brechen ist nicht eine Krawatte (es ist nicht deterministisch ist) und es produziert Rangnummer anders, wenn Sie Daten bestellt haben, in Tempentabelle und wenn nicht bestellt. Versuchen Sie, einige PK auf Ihre temporäre Tabelle hinzufügen, so wird der obige Code wie folgt aussehen:

SELECT *, 
     row_number() OVER(PARTITION BY [AttendanceNumber] 
ORDER BY [AttendanceNumber], [LocalPatientIdentifier], [SomePK]) rn 
FROM #MySampleTemp 

Dann aus der ersten SELECT-Anweisung zu entfernen Bestellung wird keine Auswirkungen auf das Ergebnis haben.

Verwandte Themen