请问,如果写sql处理用sql产生的类似于交叉报表的结果集,针对这个结果集再分组,并且小计、合计呢?

booksfount 2004-09-23 01:44:32
下面的脚本是写在存储过程中的,然后用delphi程序调用,产生交叉报表,现在我还希望,结果集按照c_pcid进行分组,并且每一组一个小计,放在组的后面,最后,一条合计。不知是否可行?我不想在delphi中处理,不知道在sql中可否直接处理了,谢谢帮助!

下面是存储过程的一部分内容:
set @sql = ' select c_PCID,C_CUSTID,max(c_CustName) as 客户名称,'

select @sql = @sql + 'sum(case C_PTID when '''+C_PTID+''' then N_SALEWEIGHT else 0 end ) as '+ c_PTName +','
+ ' sum(case C_PTID when '''+C_PTID+''' then N_PRICE else 0 end ) as '+ c_PTName +'单价 ,'
+ ' sum(case C_PTID when '''+C_PTID+''' then N_SALEWEIGHT_m else 0 end ) as '+ c_PTName +'销售金额 ,'
from (select distinct C_PTID,c_PTName,N_PRICE from #XS_REP_CLIENTPROD_CHX) a

select @sql = left(@sql,len(@sql)-1)+ ' from #XS_REP_CLIENTPROD_CHX group by c_PCID,C_CUSTID,N_PRICE '

exec(@sql)
...全文
175 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
booksfount 2004-09-23
真是无法形容我的感谢!:)
太谢谢了!
结帖了!
回复
booksfount 2004-09-23
谢谢,我试验一下
回复
zjcxc 2004-09-23
--测试数据
CREATE TABLE #XS_REP_CLIENTPROD_CHX
(
C_PTID varchar (16) NULL ,
C_PTNAME varchar(80) NULL,
c_PCID varchar(50) NULL,
C_CUSTID varchar (15) NULL ,
c_CustName varchar (100) NULL ,
-- N_PRICE numeric(18, 2) NULL ,
-- N_PRENOINVOICE numeric(18, 3) NULL ,
N_SALEWEIGHT numeric(18, 3) NULL --,
-- N_INVOICEWEIGHT numeric(18, 3) NULL ,
-- N_NOINVOICE numeric(18, 3) NULL,
-- N_PRENOINVOICE_m numeric(18, 3) NULL,
-- N_SALEWEIGHT_m numeric(18, 3) NULL ,
-- N_INVOICEWEIGHT_m numeric(18, 3) NULL ,
-- N_NOINVOICE_m numeric(18, 3) NULL
)

insert #XS_REP_CLIENTPROD_CHX
select '001001','葡萄','0201','0201001','客户1',1
union all select '001001','葡萄','0201','0201002','客户2',2
union all select '001001','苹果','0201','0201001','客户1',3
union all select '001001','苹果','0201','0201002','客户2',4
go

--查询
declare @s varchar(8000)
set @s=''
select @s=@s+',['+C_PTNAME+']=sum(case C_PTNAME when '''
+C_PTNAME+''' then N_SALEWEIGHT else 0 end)'
from #XS_REP_CLIENTPROD_CHX
group by C_PTNAME
exec('
select c_PCID=case
when grouping(c_PCID)=1 then ''总计''
else c_PCID end
,C_CUSTID=case
when grouping(c_PCID)=1 then ''''
when grouping(C_CUSTID)=1 then ''小计''
else C_CUSTID end
,c_CustName=case
when grouping(c_CustName)=0 then c_CustName
else '''' end
'+@s+'
from #XS_REP_CLIENTPROD_CHX
group by c_PCID,C_CUSTID,c_CustName with rollup
having (grouping(c_PCID)=1 or grouping(C_CUSTID)=1)
or grouping(c_CustName)=0
')
go

--删除测试
drop table #XS_REP_CLIENTPROD_CHX

/*--测试结果

c_PCID C_CUSTID c_CustName 苹果 葡萄
---------- --------------- -------------------- ----------- ---------
0201 0201001 客户1 3.000 1.000
0201 0201002 客户2 4.000 2.000
0201 小计 7.000 3.000
总计 7.000 3.000

--*/
回复
booksfount 2004-09-23
c_PCID是C_CUSTID 客户类别编号,不同客户类别的要小计汇总出来,然后出来总计,不知可否
回复
booksfount 2004-09-23
这个是临时表的表结构
CREATE TABLE #XS_REP_CLIENTPROD_CHX
(
C_PTID varchar (16) NULL ,
C_PTNAME varchar(80) NULL,
c_PCID varchar(50) NULL,
C_CUSTID varchar (15) NULL ,
c_CustName varchar (100) NULL ,
N_PRICE numeric(18, 2) NULL ,
N_PRENOINVOICE numeric(18, 3) NULL ,
N_SALEWEIGHT numeric(18, 3) NULL ,
N_INVOICEWEIGHT numeric(18, 3) NULL ,
N_NOINVOICE numeric(18, 3) NULL,
N_PRENOINVOICE_m numeric(18, 3) NULL,
N_SALEWEIGHT_m numeric(18, 3) NULL ,
N_INVOICEWEIGHT_m numeric(18, 3) NULL ,
N_NOINVOICE_m numeric(18, 3) NULL
)

前面几个字短的数据是这样的
C_PTID C_PTNAME c_PCID C_CUSTID C_CUSTname N_SALEWEIGHT

----------------------------------------------------------
001001 葡萄 0201 0201001 客户1 1
001001 葡萄 0201 0201002 客户2 2
001001 苹果 0201 0201001 客户1 3
001001 苹果 0201 0201002 客户2 4

。。。。。。。。。。。。
sql 处理后这样
c_PCID C_CUSTID C_CUSTname 葡萄 苹果 。。。。。。
---------------------------------------------
0201 0201001 客户1 1 3
0201 0201002 客户2 2 4
...................
小计 3 7
.........................................
我是想让小计按照c_pcid汇总出来,然后,再小计雷加出来合计

谢谢帮助!
回复
zjcxc 2004-09-23
帖表结构及数据出来看看.
回复
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2004-09-23 01:44
社区公告
暂无公告