感谢出题者,如有冒犯,请与我联系,希望和大家一起学习交流。(目前使用oracle数据库环境编写sql)
题目
有如下一张表T,
想要得到如下结果
该如何写这个SQL?
读者可以试着自己思考写下,再往下翻... 如有不同解题方式,大家一起交流。
解答:
sys@WIL> WITH TTT AS ( 2 SELECT '张三' NAME,100 DAY_AMT, 900 WEEK_AMT, 2700 MON_AMT, 1 GRO FROM dual UNION ALL 3 SELECT '李四' ,120 , 680 , 2900 , 1 FROM dual UNION ALL 4 SELECT '王五' ,110 , 850 , 3000 , 2 FROM dual UNION ALL 5 SELECT '马六' ,120 , 790 , 2800 , 2 FROM dual 6 ) 7 SELECT DECODE(GROUPING_ID(GRO, NAME), 8 1, 9 '组' || GRO, 10 3, 11 '总计', 12 NAME) "姓名", 13 SUM(DAY_AMT) "日金额", 14 SUM(WEEK_AMT) "周金额", 15 SUM(MON_AMT) "月金额" 16 FROM TTT 17 GROUP BY ROLLUP(GRO, NAME) ORDER BY GRO,2;
结果:
姓名 日金额 周金额 月金额 ------------------------------------------ ---------- ---------- ---------- 张三 100 900 2700 李四 120 680 2900 组1 220 1580 5600 王五 110 850 3000 马六 120 790 2800 组2 230 1640 5800 总计 450 3220 11400