求多行多列的交叉报表

weixin_37016780 2017-03-17 01:39:02
原数据集未排序结果如下:
原数据集排序后结果如下:
要求达到的效果如下:
住院号 姓名 病人类别 入院时间 入院天数 住院医生 住院病区 住院科室 入院诊断 DR 材料 CT费用 化验费 。。。。(N个项目)
1702141 蔡** 市医保 2017-03-16 18:53:13.000 1 刘* 骨科二病区 骨科住院二 NULL 95.00 44.00 33. 33 (N个对应的金额)
1702241 张** 市医保 2017-03-16 18:53:13.000 1 刘* 骨科二病区 骨科住院二 NULL 92.00 43.00 31. (N个对应的金额)

请大牛帮帮忙 ,新手折腾不了这个多列多行的交叉。。。
...全文
348 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2017-03-17
  • 打赏
  • 举报
回复
行转列的方法请参考以上楼层各大大的例子和文章. 提供一个新思路,可以用空间换时间,即新建一个目标表,然后在基础表上建触发器,每次更新基础表时同步更新目标表. 这样查询时无需再进行行转列运算.
中国风 2017-03-17
  • 打赏
  • 举报
回复
gw6328 2017-03-17
  • 打赏
  • 举报
回复


CREATE TABLE T([住院号] NVARCHAR(10),[姓名] NVARCHAR(10),[项目] NVARCHAR(10),[金额] DECIMAL(20,2)) -- 中间省略一些字段

INSERT INTO T (住院号,姓名,项目,金额) VALUES 
('101','小明','材料1',50.3),
('101','小明','材料2',20.1),
('101','小明','X光',150.3),
('101','小明','CT',50.3),
('102','大明','材料1',50.3),
('102','大明','材料2',20.1),
('102','大明','X光',150.3),
('102','大明','CTX',50.3)


DECLARE @sqlcol NVARCHAR(max),@sql NVARCHAR(MAX);

;WITH xm AS ( --这里你应该有一个专门的表存,我这里就选当前的一些测试就行了
SELECT DISTINCT 项目 FROM t
)
SELECT @sqlcol=STUFF((SELECT ',['+项目+']' FROM xm FOR XML PATH('')),1,1,'')

SELECT @sql='select * from t pivot (sum(金额) for 项目 in ('+@sqlcol+')) pvt'

EXEC(@sql);

DROP TABLE t;
/*
住院号        姓名         CT             CTX         X光         材料1            材料2
---------- ---------- -------------------------- ------------------------- ---------------
102        大明         NULL           50.30       150.30     50.30          20.10
101        小明         50.30          NULL        150.30     50.30          20.10
*/
你这个就是行转列,你多查一下。
shoppo0505 2017-03-17
  • 打赏
  • 举报
回复
建一个带所有诊断的临时表,把数据一个一个存进去

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧