为什么我的SQL输出存在差异

时间:2016-11-09 08:56:49

标签: tsql pivot sql-order-by

这让我感到困惑,我知道如果没有这些数据可能很难,但我认为这可能是一个很长的问题。

接下来,我收到的第一个代码就是这个

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]

我尝试做的是在查询中复制它,如下所示:

USE [放射治疗]

;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如何以及为什么会影响输出。我以为这只是显示结果是如何排序的?理解为什么代码正在做它正在做的事情是我真正需要解决的问题。任何建议都超过欢迎。

1 个答案:

答案 0 :(得分: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语句中删除排序不会对结果集产生影响。