select place,pkid,zongcai,ShiJianSum from ( select place ,cast(PKID as varchar(10)) pkid, zongcai, ShiJian ShiJianSum,zongcai flag1,0 flag2 from tbl union all select 'place' ,'all', zongcai, sum(ShiJian),zongcai,1 from tbl group by zongcai union all select 'place' ,'all', 'all',sum(ShiJian),'zzzzzzzz',null from tbl) tem order by flag1,flag2
如果没有place列的话,我通过一下找个sql可以解决问题!!加上place列的话,我就不知道怎么写了!!是不是用下面的方法无法解决!? SELECT CASE WHEN (GROUPING(PKID) = 1) THEN 'ALL' ELSE ISNULL(PKID, 'UNKNOWN') END AS PKID,CASE WHEN (GROUPING(zongcai) = 1) THEN 'ALL' ELSE ISNULL(zongcai, 'UNKNOWN') END AS zongcai,SUM(shijian) AS ShiJianSum FROM TestHuiZong GROUP BY zongcai,PKID WITH ROLLUP ===弯弯的月亮小小的船,小小的船,两头尖,我在小小的船里坐,只看见闪闪 的星星蓝蓝的天. ===本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
/*create procedure pyc (@dat3 varchar(22), @dat4 varchar(22), @s varchar(22)) as */ declare @dat3 varchar(22), @dat4 varchar(22), @s varchar(22) set @dat3 = '2001-02-02' set @dat4 = '2002-10-02' set @s = '01' declare @str varchar(3000), @str1 varchar(222), @str11 varchar(1000), @str2 varchar(3000), @str3 varchar(50),@str4 varchar(8000), @str31 varchar(50), @str5 varchar(3000), @str6 varchar(1000), @str7 varchar(1000), @str8 varchar(2000), @a varchar(50) set @str = '' set @str2 = '' set @str3 = '' set @str31 = '' set @str4 = '' set @str5 = '' set @str6 = '' set @str7 = '' set @str8 = '' set @str11 = '' set @a = ''declare cursor1 cursor for select distinct vProductNumber from YConsignmentProductAccountopen cursor1 fetch next from cursor1 into @str1while (@@fetch_status = 0) begin select @a = vProductName from YStockMaster where vProductNumber = @str1 if @a = '' set @a = @str1 set @str6 = @str6 + ' + cast(sum ([' + @str1 + '金额]) as numeric(27,2))' set @str5 = @str5 + ', cast(sum ([' + (@str1) +'数量]) as numeric(27,2)) , cast(sum ([' + (@str1) +'金额]) as numeric(27,2))' set @str8 = @str8 + ', cast(sum ([' + (@str1) +'数量]) as numeric(27,2)) , cast(sum ([' + (@str1) +'金额]) as numeric(27,2))' set @str = @str + ',cast(b.['+@str1+'数量] as numeric(27,2)) as [' + @a + '数量] , cast(b.['+@str1+'金额] as numeric(27,2)) as [' + @a + '金额]' set @str7 = @str7 + ' + cast(b.[' + @str1 + '金额] as numeric(27,2))' set @str2 = @str2 + ' , SUM(CASE vProductNumber WHEN ''' + @str1 + ''' THEN iAmount ELSE 0 END) AS [' + @str1 + '数量] , SUM(CASE vProductNumber WHEN ''' + @str1 + ''' THEN mConsignmentSum ELSE 0 END) AS [' + @str1 + '金额] ' --不论字段vProductName有几个值,变量@str1只选择第一个!!! set @str11 = @str11 + ',a.[' + @a + '数量] ,a.[' + @a + '金额]'
fetch next from cursor1 into @str1 end set @str6 = Right (@str6,len(@str6) - 2) set @str7 = Right (@str7, len(@str7) - 2) set @str = 'select a.dConsignmentDate 发出日期, a.客户 ' + @str11 + ', a.合计 from (select YBusinessClient.vConsignerName as 客户, b.vDistributionChannelNumber, b.dConsignmentDate, b.vRequireSideNumber ' + @str + ', ' + @str7 + ' as 合计 from ( select vRequireSideNumber, vDistributionChannelNumber, dConsignmentDate' + @str2 + ' from YConsignmentProductAccount where dConsignmentDate between cast(''' + @dat3 + ''' as datetime) and cast(''' + @dat4 + ''' as datetime) and vRegionNumber = ''' + @s + ''' group by vDistributionChannelNumber, vRequireSideNumber, dConsignmentDate) as b inner join YBusinessClient on b.vRequireSideNumber = YBusinessClient.vClientNumber where b.vDistributionChannelNumber = '--YConsignmentProductAccount.vRequireSideName(需方名称)对应的vRequireSideNumber(需方编号)是否全部在录入发货商品帐主表之前维护。 set @str5 = '小计''' + @str5 + ' ,' + @str6 + ' from ( select vRequireSideNumber, vDistributionChannelNumber' + @str2 + ' from YConsignmentProductAccount where dConsignmentDate between cast(''' + @dat3 + ''' as datetime) and cast(''' + @dat4 + ''' as datetime) and vRegionNumber = ''' + @s + ''' group by vDistributionChannelNumber, vRequireSideNumber) as b inner join YBusinessClient on b.vRequireSideNumber = YBusinessClient.vClientNumber where b.vDistributionChannelNumber = '''close cursor1 deallocate cursor1declare cursor2 cursor for select distinct vDistributionChannelNumber from YConsignmentProductAccount where dConsignmentDate between cast('2001-02-02' as datetime) and cast('2002-10-02' as datetime) and vRegionNumber = '' + @s + ''open cursor2 fetch next from cursor2 into @str3 if @str3 = null set @str3 = '' while (@@fetch_status = 0) begin select @str31 = vPersonName from XSalesDelegatePersonBase where vPersonNo = @str3 set @str4 = @str + '''' + @str3 +''') as a union all ' + 'select '''', ''' + @str31 + @str5 + @str3 +''' union all '+ @str4 fetch next from cursor2 into @str3 end set @str4 = @str4 + ' select '''', ''合计''' + @str8 + ', ' + @str6 + ' as 合计 from (select vRequireSideNumber, vDistributionChannelNumber' + @str2 + ' from YConsignmentProductAccount where dConsignmentDate between cast(''' + @dat3 + ''' as datetime) and cast(''' + @dat4 + ''' as datetime) and vRegionNumber = ''' + @s + ''' group by vDistributionChannelNumber, vRequireSideNumber) as b'print len(@str4) print @str4 --exec (@str4)close cursor2 deallocate cursor2/* 可以参考。第一必须用游标,第二必须用UNION ALL */
我菜鸟,不知行不行 select place,pkid,zongcai,shijian from table group by zongcai with rollup go
--测试环境 create table [user] ( id int identity, name char(10), pass char(10), date datetime, userno char(10) )create table sort ( id int identity, name char(30), price decimal(10,2) )create table pay ( id int identity, uid int, sid int, date datetime, )create table money ( id int identity, userno int, price decimal(10,2), date datetime ) --测试数据 ,楼主提供的测试数据,与产生的报表数据不匹配 insert [user] values('tmyu','123','2003-11-21','201') insert [user] values('tttt','123','2003-11-21','202') insert [user] values('rrrr','123','2003-11-21','301') insert [user] values('ffff','123','2003-11-21','302') insert [user] values('gggg','123','2003-11-21','303') insert sort values('鸡蛋',2) insert sort values('鸭蛋',3) insert sort values('电视机',15) insert sort values('电脑',20) insert sort values('衣服',25) insert pay values(1,2,'2003-11-21') insert pay values(1,3,'2003-11-20') insert pay values(2,5,'2003-11-15') insert pay values(5,4,'2003-11-11') insert pay values(3,1,'2003-11-15') insert pay values(1,2,'2003-11-15') insert pay values(4,1,'2003-11-11')delete from money insert money values('201',21,'2003-11-21') insert money values('202',23,'2003-11-20') insert money values('301',2,'2003-11-15') insert money values('302',2,'2003-11-11') insert money values('303',23,'2003-11-15')--比较烦,表字段的数据类型我自己定的--建视图 create view test as select u.userno 班次序号, u.name 用户, sum(case when sid = 1 then s.price else 0 end) 类1, sum(case when sid = 2 then s.price else 0 end) 类2, sum(case when sid = 3 then s.price else 0 end) 类3, sum(case when sid = 4 then s.price else 0 end) 类4, sum(case when sid = 5 then s.price else 0 end) 类5, sum(s.price) 合计, m.price 实收, case when m.price >= sum(s.price) then m.price - sum(s.price) else 0 end 长款, case when m.price < sum(s.price) then sum(s.price) - m.price else 0 end 短款, sum(s.price) 应收 from pay p join [user] u on p.uid = u.id join sort s on p.sid = s.id join money m on u.userno = m.userno group by u.userno,u.name,m.price--实现, 实在不能推断出误差是怎么计算的!!!! select 班次序号,用户,类1,类2,类3,类4,类5,合计,实收,长款,短款,应收 from ( select u.userno 班次序号, u.name 用户, sum(case when sid = 1 then s.price else 0 end) 类1, sum(case when sid = 2 then s.price else 0 end) 类2, sum(case when sid = 3 then s.price else 0 end) 类3, sum(case when sid = 4 then s.price else 0 end) 类4, sum(case when sid = 5 then s.price else 0 end) 类5, sum(s.price) 合计, m.price 实收, case when m.price >= sum(s.price) then m.price - sum(s.price) else 0 end 长款, case when m.price < sum(s.price) then sum(s.price) - m.price else 0 end 短款, sum(s.price) 应收, left(u.userno,1) flag1, 0 flag2 from pay p join [user] u on p.uid = u.id join sort s on p.sid = s.id join money m on u.userno = m.userno group by u.userno,u.name,m.price union all select '小计' ,cast(count(*) as varchar) + '人',sum(类1),sum(类2),sum(类3),sum(类4),sum(类5),sum(合计),sum(实收),sum(长款),sum(短款),sum(应收),left(班次序号,1) flag1,1 flag2 from test group by left(班次序号,1) union all select '合计' , cast(count(*) as varchar) + '人',sum(类1),sum(类2),sum(类3),sum(类4),sum(类5),sum(合计),sum(实收),sum(长款),sum(短款),sum(应收),9 flag1,2 flag2 from (select 0 flag,* from test)test group by flag ) a order by a.flag1 , a.flag2 班次序号 用户 类1 类2 类3 类4 类5 合计 实收 长款 短款 应收 ------- ------- ---------- ----- ---------------------------------------- -------------- 201 tmyu .00 6.00 15.00 .00 .00 21.00 21.00 .00 .00 21.00 202 tttt .00 .00 .00 .00 25.00 25.00 23.00 .00 2.00 25.00 小计 2人 .00 6.00 15.00 .00 25.00 46.00 44.00 .00 2.00 46.00 303 gggg .00 .00 .00 20.00 .00 20.00 23.00 3.00 .00 20.00 301 rrrr 2.00 .00 .00 .00 .00 2.00 2.00 .00 .00 2.00 302 ffff 2.00 .00 .00 .00 .00 2.00 2.00 .00 .00 2.00 小计 3人 4.00 .00 .00 20.00 .00 24.00 27.00 3.00 .00 24.00 合计 5人 4.00 6.00 15.00 20.00 25.00 70.00 71.00 3.00 2.00 70.00(所影响的行数为 8 行)
select place ,cast(PKID as varchar(10)) pkid, zongcai, ShiJian ShiJianSum,zongcai flag1,0 flag2 from tbl
union all
select 'place' ,'all', zongcai, sum(ShiJian),zongcai,1 from tbl group by zongcai
union all
select 'place' ,'all', 'all',sum(ShiJian),'zzzzzzzz',null from tbl) tem order by flag1,flag2
SELECT CASE WHEN (GROUPING(PKID) = 1) THEN 'ALL' ELSE ISNULL(PKID, 'UNKNOWN') END AS PKID,CASE WHEN (GROUPING(zongcai) = 1) THEN 'ALL' ELSE ISNULL(zongcai, 'UNKNOWN') END AS zongcai,SUM(shijian) AS ShiJianSum FROM TestHuiZong GROUP BY zongcai,PKID WITH ROLLUP
===弯弯的月亮小小的船,小小的船,两头尖,我在小小的船里坐,只看见闪闪
的星星蓝蓝的天.
===本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
(@dat3 varchar(22), @dat4 varchar(22), @s varchar(22))
as
*/
declare @dat3 varchar(22), @dat4 varchar(22), @s varchar(22)
set @dat3 = '2001-02-02' set @dat4 = '2002-10-02' set @s = '01'
declare @str varchar(3000), @str1 varchar(222), @str11 varchar(1000), @str2 varchar(3000), @str3 varchar(50),@str4 varchar(8000), @str31 varchar(50),
@str5 varchar(3000), @str6 varchar(1000), @str7 varchar(1000), @str8 varchar(2000), @a varchar(50)
set @str = '' set @str2 = '' set @str3 = '' set @str31 = ''
set @str4 = '' set @str5 = '' set @str6 = '' set @str7 = '' set @str8 = '' set @str11 = '' set @a = ''declare cursor1 cursor
for select distinct vProductNumber from YConsignmentProductAccountopen cursor1 fetch next from cursor1 into @str1while (@@fetch_status = 0)
begin
select @a = vProductName from YStockMaster where vProductNumber = @str1
if @a = ''
set @a = @str1
set @str6 = @str6 + ' + cast(sum ([' + @str1 + '金额]) as numeric(27,2))'
set @str5 = @str5 + ', cast(sum ([' + (@str1) +'数量]) as numeric(27,2))
, cast(sum ([' + (@str1) +'金额]) as numeric(27,2))'
set @str8 = @str8 + ', cast(sum ([' + (@str1) +'数量]) as numeric(27,2))
, cast(sum ([' + (@str1) +'金额]) as numeric(27,2))'
set @str = @str + ',cast(b.['+@str1+'数量] as numeric(27,2)) as [' + @a + '数量]
, cast(b.['+@str1+'金额] as numeric(27,2)) as [' + @a + '金额]'
set @str7 = @str7 + ' + cast(b.[' + @str1 + '金额] as numeric(27,2))'
set @str2 = @str2 + ' , SUM(CASE vProductNumber WHEN ''' + @str1 + ''' THEN iAmount ELSE 0 END) AS [' + @str1 + '数量]
, SUM(CASE vProductNumber WHEN ''' + @str1 + ''' THEN mConsignmentSum ELSE 0 END) AS [' + @str1 + '金额]
'
--不论字段vProductName有几个值,变量@str1只选择第一个!!!
set @str11 = @str11 + ',a.[' + @a + '数量]
,a.[' + @a + '金额]'
fetch next from cursor1 into @str1
end set @str6 = Right (@str6,len(@str6) - 2)
set @str7 = Right (@str7, len(@str7) - 2) set @str = 'select a.dConsignmentDate 发出日期, a.客户
' + @str11 + ', a.合计
from
(select YBusinessClient.vConsignerName as 客户, b.vDistributionChannelNumber, b.dConsignmentDate, b.vRequireSideNumber
' + @str + ',
' + @str7 + ' as 合计
from ( select vRequireSideNumber, vDistributionChannelNumber, dConsignmentDate' + @str2 + '
from YConsignmentProductAccount
where dConsignmentDate between cast(''' + @dat3 + ''' as datetime) and cast(''' + @dat4 + ''' as datetime)
and vRegionNumber = ''' + @s + '''
group by vDistributionChannelNumber, vRequireSideNumber, dConsignmentDate) as b inner join YBusinessClient
on b.vRequireSideNumber = YBusinessClient.vClientNumber
where b.vDistributionChannelNumber = '--YConsignmentProductAccount.vRequireSideName(需方名称)对应的vRequireSideNumber(需方编号)是否全部在录入发货商品帐主表之前维护。
set @str5 = '小计''' + @str5 + '
,' + @str6 + '
from
( select vRequireSideNumber, vDistributionChannelNumber' + @str2 + '
from YConsignmentProductAccount
where dConsignmentDate between cast(''' + @dat3 + ''' as datetime) and cast(''' + @dat4 + ''' as datetime)
and vRegionNumber = ''' + @s + '''
group by vDistributionChannelNumber, vRequireSideNumber) as b inner join YBusinessClient
on b.vRequireSideNumber = YBusinessClient.vClientNumber
where b.vDistributionChannelNumber = '''close cursor1
deallocate cursor1declare cursor2 cursor for select distinct vDistributionChannelNumber from YConsignmentProductAccount
where dConsignmentDate between cast('2001-02-02' as datetime) and cast('2002-10-02' as datetime)
and vRegionNumber = '' + @s + ''open cursor2 fetch next from cursor2 into @str3
if @str3 = null
set @str3 = ''
while (@@fetch_status = 0)
begin
select @str31 = vPersonName from XSalesDelegatePersonBase where vPersonNo = @str3
set @str4 = @str + '''' + @str3 +''') as a
union all
' + 'select '''', ''' + @str31 + @str5 + @str3 +'''
union all
'+ @str4
fetch next from cursor2 into @str3
end set @str4 = @str4 + '
select '''', ''合计''' + @str8 + ',
' + @str6 + '
as 合计 from (select vRequireSideNumber, vDistributionChannelNumber' + @str2 + '
from YConsignmentProductAccount
where dConsignmentDate between cast(''' + @dat3 + ''' as datetime) and cast(''' + @dat4 + ''' as datetime)
and vRegionNumber = ''' + @s + '''
group by vDistributionChannelNumber, vRequireSideNumber) as b'print len(@str4)
print @str4
--exec (@str4)close cursor2
deallocate cursor2/*
可以参考。第一必须用游标,第二必须用UNION ALL
*/
select place,pkid,zongcai,shijian from table
group by zongcai with rollup
go
create table [user]
(
id int identity,
name char(10),
pass char(10),
date datetime,
userno char(10)
)create table sort
(
id int identity,
name char(30),
price decimal(10,2)
)create table pay
(
id int identity,
uid int,
sid int,
date datetime,
)create table money
(
id int identity,
userno int,
price decimal(10,2),
date datetime
)
--测试数据 ,楼主提供的测试数据,与产生的报表数据不匹配
insert [user] values('tmyu','123','2003-11-21','201')
insert [user] values('tttt','123','2003-11-21','202')
insert [user] values('rrrr','123','2003-11-21','301')
insert [user] values('ffff','123','2003-11-21','302')
insert [user] values('gggg','123','2003-11-21','303')
insert sort values('鸡蛋',2)
insert sort values('鸭蛋',3)
insert sort values('电视机',15)
insert sort values('电脑',20)
insert sort values('衣服',25)
insert pay values(1,2,'2003-11-21')
insert pay values(1,3,'2003-11-20')
insert pay values(2,5,'2003-11-15')
insert pay values(5,4,'2003-11-11')
insert pay values(3,1,'2003-11-15')
insert pay values(1,2,'2003-11-15')
insert pay values(4,1,'2003-11-11')delete from money
insert money values('201',21,'2003-11-21')
insert money values('202',23,'2003-11-20')
insert money values('301',2,'2003-11-15')
insert money values('302',2,'2003-11-11')
insert money values('303',23,'2003-11-15')--比较烦,表字段的数据类型我自己定的--建视图
create view test
as
select
u.userno 班次序号,
u.name 用户,
sum(case when sid = 1 then s.price else 0 end) 类1,
sum(case when sid = 2 then s.price else 0 end) 类2,
sum(case when sid = 3 then s.price else 0 end) 类3,
sum(case when sid = 4 then s.price else 0 end) 类4,
sum(case when sid = 5 then s.price else 0 end) 类5,
sum(s.price) 合计,
m.price 实收,
case when m.price >= sum(s.price) then m.price - sum(s.price) else 0 end 长款,
case when m.price < sum(s.price) then sum(s.price) - m.price else 0 end 短款,
sum(s.price) 应收
from pay p join [user] u on p.uid = u.id join sort s on p.sid = s.id join money m on u.userno = m.userno
group by u.userno,u.name,m.price--实现, 实在不能推断出误差是怎么计算的!!!!
select 班次序号,用户,类1,类2,类3,类4,类5,合计,实收,长款,短款,应收
from
(
select u.userno 班次序号,
u.name 用户,
sum(case when sid = 1 then s.price else 0 end) 类1,
sum(case when sid = 2 then s.price else 0 end) 类2,
sum(case when sid = 3 then s.price else 0 end) 类3,
sum(case when sid = 4 then s.price else 0 end) 类4,
sum(case when sid = 5 then s.price else 0 end) 类5,
sum(s.price) 合计,
m.price 实收,
case when m.price >= sum(s.price) then m.price - sum(s.price) else 0 end 长款,
case when m.price < sum(s.price) then sum(s.price) - m.price else 0 end 短款,
sum(s.price) 应收,
left(u.userno,1) flag1,
0 flag2
from pay p join [user] u on p.uid = u.id join sort s on p.sid = s.id join money m on u.userno = m.userno
group by u.userno,u.name,m.price
union all
select '小计' ,cast(count(*) as varchar) + '人',sum(类1),sum(类2),sum(类3),sum(类4),sum(类5),sum(合计),sum(实收),sum(长款),sum(短款),sum(应收),left(班次序号,1) flag1,1 flag2
from test
group by left(班次序号,1)
union all
select '合计' , cast(count(*) as varchar) + '人',sum(类1),sum(类2),sum(类3),sum(类4),sum(类5),sum(合计),sum(实收),sum(长款),sum(短款),sum(应收),9 flag1,2 flag2
from (select 0 flag,* from test)test
group by flag
) a
order by a.flag1 , a.flag2 班次序号 用户 类1 类2 类3 类4 类5 合计 实收 长款 短款 应收
------- ------- ---------- ----- ---------------------------------------- --------------
201 tmyu .00 6.00 15.00 .00 .00 21.00 21.00 .00 .00 21.00
202 tttt .00 .00 .00 .00 25.00 25.00 23.00 .00 2.00 25.00
小计 2人 .00 6.00 15.00 .00 25.00 46.00 44.00 .00 2.00 46.00
303 gggg .00 .00 .00 20.00 .00 20.00 23.00 3.00 .00 20.00
301 rrrr 2.00 .00 .00 .00 .00 2.00 2.00 .00 .00 2.00
302 ffff 2.00 .00 .00 .00 .00 2.00 2.00 .00 .00 2.00
小计 3人 4.00 .00 .00 20.00 .00 24.00 27.00 3.00 .00 24.00
合计 5人 4.00 6.00 15.00 20.00 25.00 70.00 71.00 3.00 2.00 70.00(所影响的行数为 8 行)