当前位置: 代码迷 >> Sql Server >> 请问一个动态列传行的有关问题,谢谢
  详细解决方案

请问一个动态列传行的有关问题,谢谢

热度:65   发布时间:2016-04-24 09:02:28.0
请教一个动态列传行的问题,多谢!
现在有这样一个需要,我需要将一些数据进行列传行,举例说明:TABLE1表中,存储的是患者的诊断信息,不同的患者可能有不同的诊断(一个诊断一行数据,可多行)如下图中TABLE所示,但是现在需要做一个固定格式的统计报表,此报表要求的是每一个人一行来显示,只需要提供四个诊断即可(少于4个诊断的都取出来,多于4个诊断的只取其中4个即可),如下图中“需要的样式”所描述的一样。不知道SQL语句如何来实现。在这里谢谢各位!

------解决思路----------------------
--动态
DECLARE @SQL VARCHAR(8000)
DECLARE @M INT,@I VARCHAR(10)
SET @SQL='SELECT NAME'
SET @M=4
SET @I=1
WHILE @I<=@M
SELECT @SQL=@SQL+',MAX(CASE WHEN RN='+@I+' THEN DIAGNOSIS END)[D'+@I+']',@I=@I+1
SET @SQL=@SQL+' FROM(SELECT *,ROW_NUMBER()OVER(PARTITION BY NAME ORDER BY GETDATE())RN'
+' FROM Table1)T GROUP BY NAME'
PRINT @SQL
EXEC(@SQL)
--静态
SELECT NAME
,MAX(CASE WHEN RN=1 THEN DIAGNOSIS END)[D1]
,MAX(CASE WHEN RN=2 THEN DIAGNOSIS END)[D2]
,MAX(CASE WHEN RN=3 THEN DIAGNOSIS END)[D3]
,MAX(CASE WHEN RN=4 THEN DIAGNOSIS END)[D4]
FROM(SELECT *,ROW_NUMBER()OVER(PARTITION BY NAME ORDER BY GETDATE())RN FROM Table1)T
GROUP BY NAME


如果固定4项,可以不用动态
------解决思路----------------------
--动态
DECLARE @SQL VARCHAR(8000)
DECLARE @M INT,@I VARCHAR(10)
SET @SQL='SELECT NAME'
SELECT TOP 1 @M=COUNT(1)FROM Table1 GROUP BY [NAME] ORDER BY COUNT(1) DESC
IF @M>4 SET @M=4
SET @I=1
WHILE @I<=@M
SELECT @SQL=@SQL+',MAX(CASE WHEN RN='+@I+' THEN DIAGNOSIS END)[D'+@I+']',@I=@I+1
SET @SQL=@SQL+' FROM(SELECT *,ROW_NUMBER()OVER(PARTITION BY [NAME] ORDER BY GETDATE())RN'
+' FROM Table1)T GROUP BY [NAME]'
--PRINT @SQL
EXEC(@SQL)
不足四个的情况,最多是多少则显示多少
  相关解决方案