2016-11-09 90 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语句然后除去排序不会对结果集的效果。