帮人提问。高手指教。回答对者至少50分。

ShapeRock 2003-03-14 09:49:07
表1
科室编码 费用名称 金额
1 手术费 120
1 检查费 80
2 药费 230
2 B超费 180
... .... ...
. . .
. . .
... .... ...
表2
科室编码 科室名称
1 外科
2 内科
... .....
. .
. .
N 放射科

要求输出表3
科室名称 手术费 检查费 药费 B超 .......
外科 120 80 0 0 ......
内科 0 0 230 180 ......
.... ... ... ... ... ......

这里的表1中的每个科室编号对应的费用名称不是固定的。不定多少个。怎么写SQL?
...全文
23 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sure_ok 2003-03-28
  • 打赏
  • 举报
回复
df
happydreamer 2003-03-14
  • 打赏
  • 举报
回复
构造动态@sql语句是关键技巧,我也是偷学了一招的,嘻嘻
ShapeRock 2003-03-14
  • 打赏
  • 举报
回复
明白了。
pengdali 2003-03-14
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select b.科室名称,'

select @sql = @sql + 'sum(case a.费用名称 when '''+费用名称+'''
then a.金额 else 0 end) as '''+费用名称+''','
from (select distinct 费用名称 from 表1) as a
-------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^取得你的表有那些费用名称
/*
根据那些费用名称动态构造:
sum(case when a.费用名称='手术费' then 金额 else 0 end) as 手术费,
sum(case when a.费用名称='检查费' then 金额 else 0 end) as 检查费,
sum(case when a.费用名称='药费' then 金额 else 0 end) as 药费,
sum(case when a.费用名称='B超' then 金额 else 0 end) as B超,
...
*/

select @sql = left(@sql,len(@sql)-1) + ' from 表1 a join 表2 b on a.科室编码=b.科室编码 group by b.科室名称'

print @sql
--exec(@sql)
go
ShapeRock 2003-03-14
  • 打赏
  • 举报
回复
力哥,我能明白一点。能不能把思路说一下,我会另开贴给你分的。
happydreamer 2003-03-14
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select b.科室名称 ,'

select @sql = @sql + 'sum(case 费用名称 when '''+费用名称 +'''
then 金额 else 0 end) as ['+费用名称 +'],'
from (select distinct 金额 from 库表) a

select @sql = left(@sql,len(@sql)-1) + ' from 表1 a join 表2 b on
a. 科室编码=b. 科室编码 group by b.科室名称'

exec(@sql)
pengdali 2003-03-14
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select b.科室名称,'

select @sql = @sql + 'sum(case a.费用名称 when '''+费用名称+'''
then a.金额 else 0 end) as '''+费用名称+''','
from (select distinct 费用名称 from 表1) as a

select @sql = left(@sql,len(@sql)-1) + ' from 表1 a join 表2 b on a.科室编码=b.科室编码 group by b.科室名称'

exec(@sql)
go
ShapeRock 2003-03-14
  • 打赏
  • 举报
回复
to Rewiah(乘长风)
表a.费用名称不是固定的数目,也不一定非有手术费,也很有几百种费用名称。
pengdali 2003-03-14
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select b.科室名称,'

select @sql = @sql + 'sum(case a.费用名称 when '''+费用名称+'''
then a.金额 else 0 end) as '''+费用名称+''','
from (select distinct 费用名称 from 表1) as a

select @sql = left(@sql,len(@sql)-1) + ' from 表1 a join 表2 b on a.科室编码=b.科室编码 group by b.科室名称'

exec(@s
Rewiah 2003-03-14
  • 打赏
  • 举报
回复
select b.科室名称,
sum(case when a.费用名称='手术费' then 金额 else 0 end) as 手术费,
sum(case when a.费用名称='检查费' then 金额 else 0 end) as 检查费,
sum(case when a.费用名称='药费' then 金额 else 0 end) as 药费,
sum(case when a.费用名称='B超' then 金额 else 0 end) as B超,
...
from 表1 a,表2 b
where a.科室编码=b.科室编码
group by b.科室名称
ny64 2003-03-14
  • 打赏
  • 举报
回复
交叉表

22,209

社区成员

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

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