2016-11-09 93 views
1

這讓我感到困惑不已,而且我知道沒有這些數據可能會很困難,但認爲這可能是一個很長的帖子。爲什麼我的SQL輸出有差異

這裏去,我收到的第一個代碼是這樣的

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] 

我試圖做的是在查詢中複製此如下:

使用[放療]

;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 

大我想,直到我的代碼返回更多的結果,讓我感到困惑。已經破壞了下來,我發現有問題的代碼從原來的查詢:

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 

當我刪除這個第一個查詢的結果一致,但我的問題是如何以及爲什麼一個ORDER BY影響輸出。我認爲這只是說明如何排序結果?瞭解爲什麼代碼在做它正在做的事情是我真正需要的東西。任何建議比歡迎。

+0

不可能確切地說,但從乍一看它不應該改變結果集的數量。 –

+0

但它確實,我剛剛運行它,首先與ORDER BY位返回300結果,然後我刪除它,只有71結果,這就是爲什麼我很困惑! – Simon

回答

1

也許它有一些與此有關的一段代碼:

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

顯然你的排序是不是打破了領帶(這是不確定性的),併產生不同的,當你在已訂購數據排名臨時表和未訂購時。嘗試一些PK添加到您的臨時表,因此上面的代碼看起來像:

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

從第一個select語句然後除去排序不會對結果集的效果。