带小计和总计的SQL语句

本文介绍了一种使用SQL进行复杂分组与汇总的方法,通过具体示例展示了如何利用GROUP BY与ROLLUP来生成带有总计和子总计的报表。文章还提供了创建测试表并插入数据的SQL脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--测试数据
create table tb([DB-ID] varchar(10),ENTITY varchar(10),DATE varchar(10),[CUST-NO] int,AMOUNT decimal(10,2),TAX decimal(10,2))
insert tb select 'RCHQ','001','2004-11-10',200000,100.00,17.00
union all select 'RCHQ','001','2004-11-10',200000,200.00,34.00
union all select 'RCHQ','001','2004-11-12',200000,150.00,25.50
union all select 'RCHQ','002','2004-11-10',200000,100.00,17.00
union all select 'RCHQ','002','2004-11-10',200000,200.00,34.00
union all select 'RCHQ','002','2004-11-12',200000,150.00,25.50
go

--查询
select [DB-ID],ENTITY,DATE,[CUST-NO],AMOUNT,TAX
from(
   
select [DB-ID]=case when grouping([DB-ID])=1 then '合计'
           
else [DB-ID] end
        ,ENTITY
=case
           
when grouping([DB-ID])=1 then ''
           
when grouping(ENTITY)=1 then '小计'
           
else ENTITY end
        ,DATE
=case
           
when grouping([DB-ID])=1 then ''
           
when grouping(ENTITY)=1 then ''
           
when grouping(DATE)=1 then '小计'
           
else DATE end
        ,
[CUST-NO]=case
           
when grouping([DB-ID])=1 then ''
           
when grouping(ENTITY)=1 then ''
           
when grouping(DATE)=1 then ''
           
when grouping([CUST-NO])=1 then '小计'
           
else cast([CUST-NO] as varchar) end
        ,AMOUNT
=sum(AMOUNT),TAX=sum(TAX) ,s1=grouping([DB-ID]),s2=[DB-ID]
        ,s3
=grouping(ENTITY),s4=ENTITY ,s5=grouping(DATE),s6=DATE
        ,s7
=grouping([CUST-NO]),s8=[CUST-NO]
   
from tb
   
group by [DB-ID],ENTITY,DATE,[CUST-NO] with rollup
   
having grouping([CUST-NO])=1
   
union all
   
select [DB-ID],ENTITY,DATE,cast([CUST-NO] as varchar),AMOUNT,TAX
        ,s1
=0,s2=[DB-ID]
        ,s3
=0,s4=ENTITY
        ,s5
=0,s6=DATE
        ,s7
=0,s8=[CUST-NO]
   
from tb
)a
order by s1,s2,s3,s4,s5,s6,s7,s8 go

--删除测试
drop table tb

--邹建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值