请教一个关于合计的问题
现在有两个表,一个是部门表,一个预算表表结构如下
select * from td_dep //部门表
depID depName
1 生产部
2 办公室
3 质检站
select * from td_pay //预算表
payID payName payDate fee_money bankroll_money depid
1 报出车费 2007-01-02 100.50 200.5 1
2 报招待费 2007-01-04 50 100 2
3 报柴油费 2007-02-24 500 1000 1
4 报柴油费 2007-03-03 200 1000 1
5 报出车费 2007-04-04 50 100 1
6 报党建费 2007-05-06 50 500 1
7 报出车费 2007-05-15 100 100 1
现在我要做一个查询,查询3月至5月生产部的预算使用情况并要做出每个月的小计以及每个月从一月到本的合计,查询结果如下:
payid payname payDate fee_money bankroll_money depname
1 报出车费 2007-01-02 100.50 200.5 生产部
本月小计 100.5 200.5
一月至本月合计 100.5 200.5
3 报柴油费 2007-02-24 500 1000 生产部
本月小计 500 1000
一月至本月合计 600.5 1200.5
4 报柴油费 2007-03-03 200 1000 生产部
本月小计 200 1000
一月至本月合计 800.5 2200.5
5 报出车费 2007-04-04 50 100 生产部
本月小计 50 100
一月至本月合计 850.5 2300.5
6 报党建费 2007-05-06 50 500 生产部
7 报出车费 2007-05-15 100 100 生产部
本月小计 150 600
一月至本月合计 1000.5 2900.5
请问这样的SQL语句怎么写?
万分感谢!!!!
[解决办法]
用union all
或者考察group by rollup()可行吗?
[解决办法]
在分析函数里找一找,估计有适用的
[解决办法]
group by rollup就可以实现的
[解决办法]
显示顺序有点不对,但结果是对的 ... 试试看~~~
===========================sql=========================================
select decode(yy.payid|| ' ', ' ', '本月小计 ',yy.payid|| ' ') as payid,
yy.payname,
tt.paydate,
tt.sum_fee_money,
tt.sum_bankroll_money,
yy.depName,
tt.ym
from (
select grouping_id(to_char(tp.payDate, 'yyyymm '),tp.payDate),
tp.payDate,
to_char(tp.payDate, 'yyyymm ') as ym,
sum(tp.fee_money) as sum_fee_money,
sum(tp.bankroll_money) as sum_bankroll_money
from td_dep td,
td_pay tp
where td.depID = tp.depid
and td.depName = '生产部 '
group by rollup(to_char(tp.payDate, 'yyyymm '),tp.payDate)
)tt
,
(select *
from td_dep td,
td_pay tp
where td.depID = tp.depid
and td.depName = '生产部 '
)yy
where tt.payDate = yy.payDate(+)
and tt.ym > = '200703 '
and tt.ym <= '200705 '
and tt.ym is not null
union all
select '一月至本月合计 ',
' ',
null,
max(all_fee_money) as all_fee_money,
max(all_bankroll_money) as all_bankroll_money,
' ',
zz.ym
from (
select to_char(tp.payDate, 'yyyymm ') as ym,
sum(tp.fee_money) over(order by tp.payDate) as all_fee_money,
sum(tp.bankroll_money) over(order by tp.payDate) as all_bankroll_money
from td_dep td,
td_pay tp
where td.depID = tp.depid
and td.depName = '生产部 '
)zz
where zz.ym > = '200703 '
and zz.ym <= '200705 '
group by zz.ym
order by 7;
==========================result=======================================
PAYID PAYNAME PAYDATE SUM_FEE_MONEY SUM_BANKROLL_MONEY DEPNAME YM
---------------------------------------- ---------------- ----------- ------------- ------------------ ------------ ------
4 报柴油费 3/3/2007 200 1000 生产部 200703
一月至本月合计 800.5 2200.5 200703
本月小计 200 1000 200703
5 报出车费 4/4/2007 50 100 生产部 200704
一月至本月合计 850.5 2300.5 200704
本月小计 50 100 200704
6 报党建费 5/6/2007 50 500 生产部 200705
7 报出车费 5/15/2007 100 100 生产部 200705
一月至本月合计 1000.5 2900.5 200705
本月小计 150 600 200705
10 rows selected