select place ,PKID, zongcai, ShiJian as ShiJian from tbl order by zongcai
 compute sum(ShiJian) by zongcai

解决方案 »

  1.   

    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
      

  2.   

    如果没有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
    ===弯弯的月亮小小的船,小小的船,两头尖,我在小小的船里坐,只看见闪闪
    的星星蓝蓝的天.
    ===本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利 
      

  3.   

    /*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
    */
      

  4.   

    我菜鸟,不知行不行
    select place,pkid,zongcai,shijian from table
    group by zongcai with rollup
    go
      

  5.   

    --测试环境
    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 行)