当前位置: 代码迷 >> Oracle开发 >> 请问一个行列转换并带数据汇总的sql
  详细解决方案

请问一个行列转换并带数据汇总的sql

热度:28   发布时间:2016-04-24 06:44:51.0
请教一个行列转换并带数据汇总的sql
数据库数据:
科室 费用类别 费用
A     药费     10
B     药费     20
C     药费     20
A     耗材     10
B     耗材     20
C     耗材     20
A     麻醉     10
B     麻醉     20
C     麻醉     20
C     手术     20
C     药费     10


期望得到数据
科室   药费    耗材   其他
A      10       10    10
B      20       20     20
C      30       20     40

其中“药费”和“耗材”横列汇总显示,其他费用类别全都汇总到 “其他”里。
 急用。提前谢谢大家
------解决方案--------------------
SELECT T1.科室,
       (SELECT SUM(费用)
          FROM T
         WHERE T.科室 = T1.科室
           AND T.费用类别 = '药费') "药费",
       (SELECT SUM(费用)
          FROM T
         WHERE T.科室 = T1.科室
           AND T.费用类别 = '耗材') "耗材",
       (SELECT SUM(费用)
          FROM T
         WHERE T.科室 = T1.科室
           AND T.费用类别 NOT IN ('药费', '耗材')) "其他"
  FROM (SELECT DISTINCT 科室 FROM T) T1

------解决方案--------------------
如楼上的 几个子查询即可
------解决方案--------------------

SELECT 科室,
SUM(CASE WHEN 费用类别 = '药费' THEN 费用 ELSE 0 END ) '药费',
SUM(CASE WHEN 费用类别 = '耗材' THEN 费用 ELSE 0 END ) '耗材',
SUM(CASE WHEN 费用类别 NOT IN ('药费','耗材') THEN 费用 ELSE 0 END ) '其它'
FROM TB
GROUP BY 科室
ORDER BY 科室

------解决方案--------------------
 WITH test AS(
SELECT 'A' 科室,'药费' 费用类别,10 费用 FROM dual UNION ALL
SELECT 'B' ,'药费' ,20  FROM dual UNION ALL
SELECT 'C' ,'药费' ,20  FROM dual UNION ALL
SELECT 'A' ,'耗材' ,10  FROM dual UNION ALL
SELECT 'B' ,'耗材' ,20  FROM dual UNION ALL
SELECT 'C' ,'耗材' ,20  FROM dual UNION ALL
SELECT 'A' ,'麻醉' ,10  FROM dual UNION ALL
SELECT 'B' ,'麻醉' ,20  FROM dual UNION ALL
SELECT 'C' ,'麻醉' ,20  FROM dual UNION ALL
SELECT 'C' ,'手术' ,20  FROM dual UNION ALL
SELECT 'C' ,'药费' ,10  FROM dual 
)
SELECT 科室,
       SUM(DECODE(费用类别, '药费', 费用, 0)) 药费, 
       SUM(DECODE(费用类别, '耗材', 费用, 0)) 药费, 
       SUM(DECODE(费用类别, '药费' ,0, '耗材', 0, 费用)) 其他
  FROM TEST
 GROUP BY 科室

------解决方案--------------------
 select A.科室,A.药材,B.耗材,C.其他 from (
       SELECT tb.科室,SUM(费用) as 药材 from tb where tb.费用类别='药费' group by tb.科室) A
      ,( SELECT tb.科室,SUM(费用) as 耗材 from tb where tb.费用类别='耗材' group by tb.科室) B
      ,( SELECT tb.科室,SUM(费用) as 其他 from tb where tb.费用类别 not in ('药费','耗材') group by tb.科室) C 
      where A.科室=B.科室 and B.科室=C.科室
  相关解决方案