日期:2014-05-17  浏览次数:20888 次

请教一个行列转换并带数据汇总的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&nb