说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

以前我在CSDN看过类似的贴字,现在忘了这样的sql语句怎么写,请知情者赐教!!

编辑:说三道四文库 发布时间:2018-05-23 09:24
HTML文档下载 WORD文档下载 PDF文档下载
表1
  科室编码            费用名称            金额
     1                手术费              120
     1                检查费              80
     2                药费                230
     2                B超费               180
    ...               ....                ...
     .                  .                  .
     .                  .                  .
    ...               ....                ...
表2
  科室编码            科室名称
     1                外科
     2                内科
    ...              .....
     .                 .
     .                 .
     N                 放射科

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


请CSDN上的兄弟姐妹支持
你用的SQL Server吗,可以用case语句写出来
我用的是sql server,请randy_mic(生于70年代)赐教
select a.科室名称,(select isNULL(金额,0) from b where a.科室编号=b.科室编号 and b.药费名称='手术费'),(select isNULL(金额,0) from b where a.科室编号=b.科室编号 and b.药费名称='检查费'),(select isNULL(金额,0) from b where a.科室编号=b.科室编号 and b.药费名称='药费'),(select isNULL(金额,0) from b where a.科室编号=b.科室编号 and b.药费名称='B超')) from 表1 a,表2 b
这是SQL Server可以实现的语句。
http://expert.csdn.net/Expert/topic/1366/1366777.xml?temp=.1545069 

看看
如果你的表1中的药费名称不是固定,也就是说可能动态增长并没有确定数目,那么实现起来很难。我帮你问问。
select b.科室名称,
sum(case a.费用名称 when a.手术费 then a.金额 else 0),
sum(case a.费用名称 when a.检查费 then a.金额 else 0),
sum(case a.费用名称 when a.药费 then a.金额 else 0),
................
from 表1 a,表2 b
where a.科室编码=b.科室编码
group by a.科室编码
哦,还不一样 ... 如果费用名称固定好写点,如果不固定楼主可不可以改改表结构 ? 用专门一个表来保存费用名称
to shaperock(单刀侠):谢谢您的关注,sorry,我还有一点没讲清楚,那就是表1中的费用名称不是固定的,因为表1是临时表,好比说B超费有时有,有时又没有,其它费用名称也类似。科室对应的费用名称也不固定。还请shaperock(单刀侠)继续关注,不胜感激!!!
to wjlsmail(计算机质子):先谢谢您的关注,改表结构的可能性不大,因为表1是我在存储过程中创建的临时表,它是由SQL语句插入的数据,请继续关注好吗?!
to bluemeteor(挂月):谢谢您的关注,sorry,我还有一点没讲清楚,那就是表1中的费用名称不是固定的,因为表1是临时表,好比说B超费有时有,有时又没有,其它费用名称也类似。科室对应的费用名称也不固定。用Case语句应该写不出来,还请bluemeteor(挂月)继续关注,不胜感激!!!
学习!!!!!!!!!!!!
你的问题应该这样写:

select b.科室名称, 
(case 费用名称 when 手术费 then 金额 else 0 end) 手术费, 
(case 费用名称 when 检查费 then 金额 else 0 end) 检查费,
(case 费用名称 when 药费 then 金额 else 0 end) 药费,
(case 费用名称 when B超 then 金额 else 0 end) B超,
from 表1 a, 表2 b where a.科室编码=b.科室编码 
group by b.科室名称,手术费,检查费,药费,B超
你的问题应该这样写:

select b.科室名称, 
(case a.费用名称 when 手术费 then a.金额 else 0 end) 手术费, 
(case a.费用名称 when 检查费 then a.金额 else 0 end) 检查费,
(case a.费用名称 when 药费 then a.金额 else 0 end) 药费,
(case a.费用名称 when B超 then a.金额 else 0 end) B超,
from 表1 a, 表2 b where a.科室编码=b.科室编码 
group by b.科室名称,手术费,检查费,药费,B超
请大家再顶一下,晚点结贴,我看
http://expert.csdn.net/Expert/topic/1366/1366777.xml?temp=.1545069 上XRS(心如水)这样的问题已结贴,不知他是怎样实现的?我按上面各位大侠的高见去做了,还是实现不了,有谁知道XRS(心如水)怎么做的吗?恳请联系XRS(心如水).
http://expert.csdn.net/Expert/topic/1529/1529397.xml?temp=.6069757,看看大力的,它得也许对。
结贴,敬请ShapeRock(单刀侠)、pengdail(大力)接份,万分感激您们及关注者
以下是个人意见,希望大家指正!

楼主的问题,很常见,
我使用过2种方法处理过:
1、前台(或者说客户端)处理 (第1种方法,我做过控件处理显示 预览 打印)
2、后台(数据库存储过程)处理(使用临时表辅助处理)
第2种方法(sql语句怎么写):
表1:(科室编码 ,费用名称 ,金额)
表2:(科室编码 ,科室名称)

1:create table #Temp (No int , Name varchar(30))

2:insert into #Temp  (No,Name)
   select distinct 科室编码 ,科室名称
   from 表2

3:declare @Money char(20)
   declare @iCount char(20)
   declare @FieldName char(21)
   set @iCount = 1

   declare MyMoney cursor for 
   select distinct 费用名称 
   from 表1

   open MyMoney
   fetch MyMoney into @Money
   while @@fetch_status = 0 
   begin
      set @FieldName = 'Field'+Rtrim(Convert(char(3),@iCount))
      Exec(N'alter table #Temp ADD ['+@FieldName+'] float ')      
      
      Exec(N'update #Temp set ['+@FieldName+']='+
            'isnull(表1.金额,0) from 表1 where #Temp.No =表1.科室编码 and '+
            '表1.费用名称 = '+'"'@Money+'"')      
      

      fetch MyMoney into @Money
      set @iCount = @iCount +1
   end
   close MyMoney
   deallocate MyMoney

4:select * from #Temp
   order by No

最终显示结果:
No      Name      Field1    Field2    Field3    Field4 ....
====    ========  ========  ========  ========  ========
还需要作的事情,把英文的字段名,转换成中文
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘