sql server ,求sql 语句把单列的数据分为多行显示
现有表A中的数据结构是这样的月份费用金额09诊疗费10009治疗费20009注射费10009护理费110后面还有很多数据想要的结果是月份费用金额费用金额09诊疗费100治...
现有表A中的数据结构是这样的
月份 费用 金额
09 诊疗费 100
09 治疗费 200
09 注射费 100
09 护理费 110 后面还有很多数据
想要的结果是
月份 费用 金额 费用 金额
09 诊疗费 100 治疗费 200
09 注射费 100 其他费 110
求大神帮忙啊!! 展开
月份 费用 金额
09 诊疗费 100
09 治疗费 200
09 注射费 100
09 护理费 110 后面还有很多数据
想要的结果是
月份 费用 金额 费用 金额
09 诊疗费 100 治疗费 200
09 注射费 100 其他费 110
求大神帮忙啊!! 展开
6个回答
展开全部
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 费用 from a group by 费用
set @sql = '[' + @sql + ']'
exec ('select * from (select * from a) a pivot (max(金额) for 费用 in (' + @sql + ')) b')
select @sql = isnull(@sql + '],[' , '') + 费用 from a group by 费用
set @sql = '[' + @sql + ']'
exec ('select * from (select * from a) a pivot (max(金额) for 费用 in (' + @sql + ')) b')
追问
这样写会把所有费用都放在一行啊!我需要一行只放两个项目和金额,剩下的弄到下一行去,大神有法子没
2013-10-12
展开全部
-- 较长,凑合用吧,表名test, 三个字段分别设为yf,fy,je
select
yf,
max(case when fy in ('诊疗费','注射费') then fy else null end),
max(case when fy in ('诊疗费','注射费') then je else null end),
max(case when fy in ('治疗费','其他费') then fy else null end),
max(case when fy in ('治疗费','其他费') then je else null end)
from (select
t.*,
case
when fy in ('诊疗费','治疗费') then 1
when fy in ('注射费','其他费') then 2
end grp
from (select yf,fy,je from test where fy in ('诊疗费','治疗费','注射费')
union all
select yf,'其他费' fy,sum(je)je from test
where fy not in ('诊疗费','治疗费','注射费')
group by yf) t) t1
group by yf,grp
-- 下面这个语句仅供参考,为其他费用不需汇总时提供一个思路
select
yf,
max(case when id%2 <> 0 then fy else null end),
max(case when id%2 <> 0 then je else null end),
max(case when id%2 = 0 then fy else null end),
max(case when id%2 = 0 then je else null end)
from
(select
t1.*,
case when id % 2 = 0 then id - 1 else id end grp
from (select
t.*,row_number()over(order by yf) id
from test t) t1) t2
group by yf,grp
select
yf,
max(case when fy in ('诊疗费','注射费') then fy else null end),
max(case when fy in ('诊疗费','注射费') then je else null end),
max(case when fy in ('治疗费','其他费') then fy else null end),
max(case when fy in ('治疗费','其他费') then je else null end)
from (select
t.*,
case
when fy in ('诊疗费','治疗费') then 1
when fy in ('注射费','其他费') then 2
end grp
from (select yf,fy,je from test where fy in ('诊疗费','治疗费','注射费')
union all
select yf,'其他费' fy,sum(je)je from test
where fy not in ('诊疗费','治疗费','注射费')
group by yf) t) t1
group by yf,grp
-- 下面这个语句仅供参考,为其他费用不需汇总时提供一个思路
select
yf,
max(case when id%2 <> 0 then fy else null end),
max(case when id%2 <> 0 then je else null end),
max(case when id%2 = 0 then fy else null end),
max(case when id%2 = 0 then je else null end)
from
(select
t1.*,
case when id % 2 = 0 then id - 1 else id end grp
from (select
t.*,row_number()over(order by yf) id
from test t) t1) t2
group by yf,grp
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
通过记录行循环或cusor进行处理,插入新的表变量或临时表中,表的结构为想要的结果,然后显示出来就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以把这个表关联两次,取别名A、B。然后第一列单费用取A表中单,后边的费用取B表的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这就没有唯一号吗?没有规律可寻啊,你需要把所有规律都写出来 然后套用case when语句
大概是这样的 case when (月份=‘09’and 费用=‘诊疗费’ then 月份,费用1,金额,费用2,金额2 when 月份.....)
像这样如此往复
大概是这样的 case when (月份=‘09’and 费用=‘诊疗费’ then 月份,费用1,金额,费用2,金额2 when 月份.....)
像这样如此往复
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个用前端设计;用单纯的查询输出这样的结果,比较复杂,也牺牲性能~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询