库存表中,有产品:
产品款号    属性一    属性二    属性三    属性四       属性五。 数量
A            1a     2b        3b       4a         5d          100
B            1b     2b        3a       4d         5d          220
C            1c     2c        3a       4e         5d          300
D            1b     2d        3d       4e         5c          150就是属性大概有20个。然后我想实现分组统计。按照选择的属性和顺序进行分组统计和小计。
比如选择属性一,二,三,就按照属性一分组汇总,分组的结果再属性二分组汇总,跟选择的属性和顺序有关。该如何写呢。

解决方案 »

  1.   

    用字符串拼SQL脚本,
    declare @sql varchar(8000)
    set @sql = '
    select
         count=sum(数量)
        ,... -- 在这里拼接传入的属性列表
    from theTable
    group by
        ... -- 在这里拼接传入的属性列表
    '
    exec @sql
      

  2.   

    这样?
    select 产品款号,属性一 ,属性二,属性三,数量=sum(数量) from tb
    group by 产品款号,属性一 ,属性二,属性三
    with rollup 
      

  3.   

    如果需要小计,在@sql后面再追加 ' with cube'
      

  4.   

    老大的.DECLARE @t TABLE(Groups char(2),Item varchar(10),Color varchar(10),Quantity int)
    INSERT @t SELECT 'aa','Table','Blue', 124
    UNION ALL SELECT 'bb','Table','Red',  -23
    UNION ALL SELECT 'bb','Cup'  ,'Green',-23
    UNION ALL SELECT 'aa','Chair','Blue', 101
    UNION ALL SELECT 'aa','Chair','Red',  -90--统计及排序
    SELECT Groups=CASE 
    WHEN GROUPING(Color)=0 THEN Groups
    WHEN GROUPING(Groups)=1 THEN '总计'
    ELSE '' END,
    Item=CASE 
    WHEN GROUPING(Color)=0 THEN Item
    WHEN GROUPING(Item)=1 AND GROUPING(Groups)=0 THEN Groups+' 合计'
    ELSE '' END,
    Color=CASE 
    WHEN GROUPING(Color)=0 THEN Color
    WHEN GROUPING(Color)=1 AND GROUPING(Item)=0 THEN Item+' 小计'
    ELSE '' END,
    Quantity=SUM(Quantity)
    FROM @t
    GROUP BY Groups,Item,Color WITH ROLLUP
    ORDER BY GROUPING(Groups),
    CASE WHEN GROUPING(Groups)=1 THEN '' ELSE Groups END DESC,
    GROUPING(Item),
    CASE WHEN GROUPING(Item)=1 THEN '' ELSE Item END DESC,
    GROUPING(Color),
    CASE WHEN GROUPING(Color)=1 THEN '' ELSE Color END DESC,
    Quantity DESC
    /*--结果
    Groups Item       Color           Quantity    
    --------- -------------- ----------------------- ----------- 
    bb     Table      Red             -23
                     Table 小计       -23
    bb     Cup       Green           -23
                     Cup 小计        -23
           bb 合计                    -46
    aa     Table      Blue            124
                     Table 小计       124
    aa     Chair      Red             -90
    aa     Chair      Blue            101
                     Chair 小计       11
           aa 合计                    135
    总计                              89
    --*/
      

  5.   

    DECLARE @t TABLE(Groups char(2),Item varchar(10),Color varchar(10),Quantity int)
    INSERT @t SELECT 'aa','Table','Blue', 124
    UNION ALL SELECT 'bb','Table','Red',  -23
    UNION ALL SELECT 'bb','Cup'  ,'Green',-23
    UNION ALL SELECT 'aa','Chair','Blue', 101
    UNION ALL SELECT 'aa','Chair','Red',  -90--汇总显示
    SELECT Groups=CASE 
    WHEN GROUPING(Color)=0 THEN Groups
    WHEN GROUPING(Groups)=1 THEN '总计'
    ELSE '' END,
    Item=CASE 
    WHEN GROUPING(Color)=0 THEN Item
    WHEN GROUPING(Item)=1 AND GROUPING(Groups)=0 THEN Groups+' 合计'
    ELSE '' END,
    Color=CASE 
    WHEN GROUPING(Color)=0 THEN Color
    WHEN GROUPING(Color)=1 AND GROUPING(Item)=0 THEN Item+' 小计'
    ELSE '' END,
    Quantity=SUM(Quantity)
    FROM @t
    GROUP BY Groups,Item,Color WITH ROLLUP
    /*--结果
    Groups Item       Color           Quantity    
    -------- ---------------- ---------------------- ----------- 
    aa     Chair      Blue            101
    aa     Chair      Red             -90
                     Chair 小计       11
    aa     Table      Blue            124
                     Table 小计       124
           aa 合计                    135
    bb     Cup        Green           -23
                      Cup 小计        -23
    bb     Table      Red             -23
                     Table 小计       -23
           bb 合计                    -46
    总计                              89
    --*/
      

  6.   

    谢谢大家的回复。
    liangCK 跟我要的结果差不多,我看下语句。to rouqu,是那样子的。还想请大家提醒下,效率上要注意什么,因为这个表里面大概会有几百万行。
      

  7.   

    liangCK   如果能够做成动态的就好了。
    就是根据属性个数和顺序进行组合。我再看看。