如何将行转换为列?

3

可能很简单,有没有一种快速转置数据的方法,使其按列而不是按行读取。

enter image description here

上面是当前的输出,但希望它可以横向阅读,例如

AttendanceNumber, ExamDate, ExamCode1, ExamCode2, ExamCode3, .......ExamCode20

我的 SQL 是:

SELECT  [AttendanceNumber]
       ,[ExaminationDate]
       ,[ExamExaminationCode]
  FROM [Radiotherapy].[dbo].[tblRadiologyData] rd 
  where rd.ExaminationDate >= '01 april 2016'
  and   rd.AttendanceSiteCode IN('CNM','RNM')
  ORDER BY rd.LocalPatientIdentifier, rd.ExaminationDate
1个回答

1

您可以使用ROW_NUMBER()进行条件聚合:

SELECT s.attendanceNumber,s.examinationDate,
       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,
       ..... As many as you need
FROM (
    SELECT  [AttendanceNumber]
           ,[ExaminationDate]
           ,[ExamExaminationCode]
           ,ROW_NUMBER() OVER(PARTITION BY [AttendanceNumber] ORDER BY [ExaminationDate]) as rnk --Ordered by date ASC 
      FROM [Radiotherapy].[dbo].[tblRadiologyData] rd 
      where rd.ExaminationDate >= '01 april 2016'
      and   rd.AttendanceSiteCode IN('CNM','RNM') ) s
GROUP BY s.attendanceNumber,s.examinationDate

太棒了,现在我有了数据,能否显示组合数量和计数(例如,ExamCode1,ExamCode2组合出现了x次)? - Simon
@Simon,我不确定我理解你的需求... 你所说的“组合”是什么意思? - sagi
没问题,我解决了,但是考试日期对于每个出勤号码都相同,所以每次运行时都会给我不同的输出,无法排列顺序! - Simon
好的,现在已经解决了,按照每个AttendanceNumber递增的RadiologyID排序,感谢您在此事上的所有帮助! - Simon
你应该接受Sagi的答案@Simon,因为它显然是一个好的解决方案。 - S3S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接