我現在有這樣的一組數據,如下:物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期
100        電腦1      P4    10    100    01       成品倉     100
200        電腦2      P2    10    100    01       成品倉     100
200        電腦2      P2    10    100    02       原料倉     100300        機箱      XP    10    100    01       成品倉     100
300        機箱      XP    10    100    02       原料倉     100
300        機箱      XP    10    100    02       原料倉     100我想對上面數據先按物料代碼排序,然后再按物料代碼分組,并匯總小計。最后加入總計,得到的結果應該如下:物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期300        機箱      XP    10    100    01       成品倉     100
機箱(小計)                 30    300 200        電腦2      P2    10    100    01       成品倉     100
200        電腦2      P2    10    100    02       原料倉     100
電腦2(小計)                 20    200 100        電腦1      P4    10    100    01       成品倉     100
電腦1(小計)                 10    100 總計                        60    600
請各位大俠幫忙!!先謝謝了!!!!!!!!!!!!!

解决方案 »

  1.   

    Select 物料代碼,物料名稱,規格,sum(數量),(金額),倉庫代碼,倉庫名稱,保質期FROM AGROUP BY 物料代碼,物料名稱,規格, 倉庫代碼,倉庫名稱,保質期WITH ROLLUP :最主要的是
    WITH ROLLUP ,后续的美化可以用case语句来做
      

  2.   

    Select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期
    From 表
    ORDER BY 物料代碼 DESC
    COMPUTE SUM(數量),SUM(金額) BY 物料代碼
      

  3.   

    不知道为什么机箱只列一条明细
    create table #tb(物料代碼 int,物料名稱 varchar(10),規格 varchar(10),數量 int,金額 int,倉庫代碼  varchar(10),倉庫名稱 varchar(10),保質期 int)
                                             insert #tb select
    100,'電腦1','P4',10,100,'01','成品倉',100 insert #tb select
    200,'電腦2','P2',10,100,'01','成品倉',100 insert #tb select
    200,'電腦2','P2',10,100,'02','原料倉',100 insert #tb select
    300,'機箱' ,'XP',10,100,'01','成品倉',100 insert #tb select
    300,'機箱' ,'XP',10,100,'02','原料倉',100 insert #tb select
    300,'機箱' ,'XP',10,100,'02','原料倉',100
    --------------------------------------------------------------------
    select stuff(物料代碼0,1,4,'')as 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期 from 
    (select rtrim(物料代碼)+'1'+rtrim(物料代碼) 物料代碼0,物料名稱,
        規格,數量,金額,倉庫代碼,倉庫名稱,rtrim(保質期)保質期 from #tb 
     union all select rtrim(物料代碼)+'0'+物料名稱+'(小計)','','',sum(數量),
        sum(金額),'','','' from #tb group by 物料代碼,物料名稱 
     union all select '0000總計','','',sum(數量),sum(金額),'','','' from #tb
    )A order by A.物料代碼0 desc
    ---------------------------------------------------------------------
    物料代碼 物料名稱 規格    數量     金額   倉庫代碼   倉庫名稱   保質期          
    300 機箱 XP 10 100 01 成品倉 100
    300 機箱 XP 10 100 02 原料倉 100
    300 機箱 XP 10 100 02 原料倉 100
    機箱(小計) 30 300
    200 電腦2 P2 10 100 02 原料倉 100
    200 電腦2 P2 10 100 01 成品倉 100
    電腦2(小計) 20 200
    100 電腦1 P4 10 100 01 成品倉 100
    電腦1(小計) 10 100
    總計 60 600 (所影响的行数为 10 行)
      

  4.   

    create table test(物料代碼 varchar(20),物料名稱 varchar(20),規格 varchar(20),數量 int,金額 int,倉庫代碼  varchar(20),倉庫名稱 varchar(20),保質期 int)
    insert test select 100,'電腦1','P4',10,100,'01','成品倉',100
    union all select 200,'電腦2','P2',10,100,'01','成品倉',100 
    union all select 200,'電腦2','P2',10,100,'02','原料倉',100 
    union all select 300,'機箱' ,'XP',10,100,'01','成品倉',100 
    union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100 
    union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期 from     
      (
    select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期=cast(保質期 as varchar),s1=0,s2=物料名稱,s3=0 from test   
        union all select 物料名稱+'(小計)','','',sum(數量),sum(金額),'','','',s1=0,s2=物料名稱,s3=1 from test   
        group by 物料名稱 
    union all select '總合計','','',sum(數量),sum(金額),'','','',s1=1,s2='',s3=1 from test
      ) t   
      order by s1,s2,s3drop table test/*
    100 電腦1 P4 10 100 01 成品倉 100
    電腦1(小計) 10 100
    200 電腦2 P2 10 100 01 成品倉 100
    200 電腦2 P2 10 100 02 原料倉 100
    電腦2(小計) 20 200
    300 機箱 XP 10 100 01 成品倉 100
    300 機箱 XP 10 100 02 原料倉 100
    300 機箱 XP 10 100 02 原料倉 100
    機箱(小計) 30 300
    總合計          60 600
    */
      

  5.   


    create table t(物料代碼 varchar(20),物料名稱 varchar(20),規格 varchar(20),數量 int,金額 int,倉庫代碼  varchar(20),倉庫名稱 varchar(20),保質期 int)
    insert t select 100,'電腦1','P4',10,100,'01','成品倉',100
    union all select 200,'電腦2','P2',10,100,'01','成品倉',100 
    union all select 200,'電腦2','P2',10,100,'02','原料倉',100 
    union all select 300,'機箱' ,'XP',10,100,'01','成品倉',100 
    union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100 
    union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100select * from t
    order by 物料代碼
    compute sum(數量),sum(金額)by 物料代碼
    物料代碼                 物料名稱                 規格                   數量          金額          倉庫代碼                 倉庫名稱                 保質期         
    -------------------- -------------------- -------------------- ----------- ----------- -------------------- -------------------- ----------- 
    100                  電腦1                  P4                   10          100         01                   成品倉                  100                                                               sum
                                                                   ===========
                                                                   10                                                                           sum
                                                                               ===========
                                                                               100
    物料代碼                 物料名稱                 規格                   數量          金額          倉庫代碼                 倉庫名稱                 保質期         
    -------------------- -------------------- -------------------- ----------- ----------- -------------------- -------------------- ----------- 
    200                  電腦2                  P2                   10          100         01                   成品倉                  100
    200                  電腦2                  P2                   10          100         02                   原料倉                  100                                                               sum
                                                                   ===========
                                                                   20                                                                           sum
                                                                               ===========
                                                                               200
    物料代碼                 物料名稱                 規格                   數量          金額          倉庫代碼                 倉庫名稱                 保質期         
    -------------------- -------------------- -------------------- ----------- ----------- -------------------- -------------------- ----------- 
    300                  機箱                   XP                   10          100         01                   成品倉                  100
    300                  機箱                   XP                   10          100         02                   原料倉                  100
    300                  機箱                   XP                   10          100         02                   原料倉                  100                                                               sum
                                                                   ===========
                                                                   30                                                                           sum
                                                                               ===========
                                                                               300
    (9 row(s) affected)
      

  6.   

    select * from t
    order by 物料代碼
    compute sum(數量),sum(金額)by 物料代碼
    coupute sum(數量)--這就是總計
      

  7.   

    Select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期
    From 表
    ORDER BY 物料代碼 DESC
    COMPUTE SUM(數量),SUM(金額) BY 物料代碼   --分类汇总
    COMPUTE SUM(數量),SUM(金額)               --总汇总
      

  8.   

    因为小计只能按前两项分组,用rollup多查出了一行总计,但其它处理比union 更复杂,我只能到那一步了,其它人答吧
      

  9.   

    使用ROLLUP和CUBE来实现!
    http://www.v2studio.cn/blog/gaojier/article.asp?id=20
    看看,不明白再联系我!
      

  10.   

    --分类查询查询描述
    --rollup操作符:选列中值的某一层次结构的聚合,返回单个结果集
    --cube操作符:所选列中所有组合的聚合,返回单个结果集
    --grouping操作符:判断结果集中的值是本来就有的,还是使用了rollup或cube以后产生的
    --compute子句:不支持text、ntext、image数据类型,子句里的字段要和select中的字段相同,为字段创建详细的
    --记录和汇总值,返回多个结果集
    --compute by子句:需要和order by一起使用,字段需要是order by的子集或全集,创建细节记录和多个汇总值,返回多个结果集--rollup的使用方法
    select productid,orderID,sum(quantity) as total from [order details]
    group by productid,orderID
    with rollup--cube的使用方法
    select productid,orderID,sum(quantity) as total from [order details]
    group by productid,orderID
    with cube
    --grouping的使用方法
    select productid,grouping(productid),orderID,grouping(orderID),sum(quantity) as total from [order details]
    group by productid,orderID
    with cube
     
    select case when (grouping(od.productid)=1) then '订单合计:'
    else isnull(od.productid,'未知') end as productID,
    case when (grouping(od.orderID)=1) then '产品合计:'
    else isnull(od.orderID,'未知') end as productID,
    sum(od.quantity) from (select convert(varchar(10),productid) as productID,convert(varchar(10),orderID) as orderid,quantity from [order details]) as od
    group by productid,orderID
    with cube
    --compute的使用方法
    select productid,quantity from [order details]
    order by productid
    compute sum(quantity) by productid--嵌套子查询
    select lastname,firstname from employees where employeeid in (select
    employeeid from orders where oders.orderdate='1998-1-1') 
    --相关子查询
    select lastname,firstname from employees as e 
    where '1998-1-1' in (select
    orderdate from orders as o where o.employeeid=e.employeeid) 以上实例可在SQL Server2000自带数据库NorthWind中可直接运行!
    对于使用cube和rollup引起的合计较多的问题,可以使用having关键字和grouping关键字来过滤。
      

  11.   

    loverpyh(龙行天下) ( ) 信誉:99    Blog   加为好友  2007-06-12 21:31:26  得分: 0  
     
     
       想利用 ROLLUP实现
      
     
    -------------
    以下是用ROLLUP結合Grouping實現的,不過和你貼出來的結果有些出入,但是你貼出來的結果應該有些問題。
    Create Table TEST(
    物料代碼 Int,
    物料名稱 Varchar(10),
    規格 Varchar(10),
    數量 Int,
    金額 Int,
    倉庫代碼  Varchar(10),
    倉庫名稱 Varchar(10),
    保質期 Int)
    Insert TEST Select 100,'電腦1','P4',10,100,'01','成品倉',100
    Union All Select 200,'電腦2','P2',10,100,'01','成品倉',100
    Union All Select 200,'電腦2','P2',10,100,'02','原料倉',100
    Union All Select 300,'機箱' ,'XP',10,100,'01','成品倉',100
    Union All Select 300,'機箱' ,'XP',10,100,'02','原料倉',100
    Union All Select 300,'機箱' ,'XP',10,100,'02','原料倉',100
    GO
    Select
    (Case When Grouping(物料代碼) = 1 Then N'總計' Else RTRIM(物料代碼) End) As 物料代碼,
    (Case When Grouping(物料名稱) = 1 And Grouping(物料代碼) = 0 Then MAX(物料名稱) + N'(小計)' Else RTRIM(物料名稱) End) As 物料名稱,
    規格,
    SUM(數量) As 數量,
    SUM(金額) As 金額,
    倉庫代碼,
    倉庫名稱,
    保質期
    From
    TEST
    Group By
    物料代碼,
    物料名稱,
    規格,
    倉庫代碼,
    倉庫名稱,
    保質期
    With RollUp
    Having (保質期 Is Not Null Or 物料名稱 Is Null)
    GO
    Drop Table TEST
    --Result
    /*
    物料代碼 物料名稱 規格 數量 金額 倉庫代碼 倉庫名稱 保質期
    100 電腦1 P4 10 100 01 成品倉 100
    100 電腦1(小計) NULL 10 100 NULL NULL NULL
    200 電腦2 P2 10 100 01 成品倉 100
    200 電腦2 P2 10 100 02 原料倉 100
    200 電腦2(小計) NULL 20 200 NULL NULL NULL
    300 機箱 XP 10 100 01 成品倉 100
    300 機箱 XP 20 200 02 原料倉 100
    300 機箱(小計) NULL 30 300 NULL NULL NULL
    總計 NULL NULL 60 600 NULL NULL NULL
    */