none
菜鸟:单表分类汇总求和问题如何写sql语句 RRS feed

  • 问题

  • 原始表格如下:

    名称 规格 数量
    名称1 规格1 1
    名称1 规格2 2
    名称1 规格3 3
    名称2 规格2 4
    名称2 规格4 5
    名称3 规格1 6
    名称3 规格4 7
    名称4 规格4 8

    要求结果如下:

    名称 规格 数量
    名称1 规格1 1
    名称1 规格2 2
    名称1 规格3 3
    名称1 汇总   6
    名称2 规格2 4
    名称2 规格4 5
    名称2 汇总   9
    名称3 规格1 6
    名称3 规格4 7
    名称3 汇总   13
    名称4 规格4 8
    名称4 汇总 8
    总计 36
    2012年2月10日 1:59

答案

  • declare @t table
    (
    	名称	 nvarchar(10)
    	,规格 nvarchar(10)
    	,数量 int
    )
    
    insert into @t values(N'名称1',N'规格1',1)
    insert into @t values(N'名称1',N'规格2',2)
    insert into @t values(N'名称1',N'规格3',3)
    insert into @t values(N'名称2',N'规格2',4)
    insert into @t values(N'名称2',N'规格4',5)
    insert into @t values(N'名称3',N'规格1',6)
    insert into @t values(N'名称3',N'规格4',7)
    insert into @t values(N'名称4',N'规格4',8)
    
    
    select *
    from (
    select 名称,规格,数量
    from @t
    union all
    select 名称 + N' 汇总' as 名称,'' as 规格,SUM(数量) as 数量
    from @t
    group by 名称
    		) t
    order by 名称


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    • 已标记为答案 sdfr2342 2012年2月10日 3:58
    2012年2月10日 2:20

全部回复

  • declare @t table
    (
    	名称	 nvarchar(10)
    	,规格 nvarchar(10)
    	,数量 int
    )
    
    insert into @t values(N'名称1',N'规格1',1)
    insert into @t values(N'名称1',N'规格2',2)
    insert into @t values(N'名称1',N'规格3',3)
    insert into @t values(N'名称2',N'规格2',4)
    insert into @t values(N'名称2',N'规格4',5)
    insert into @t values(N'名称3',N'规格1',6)
    insert into @t values(N'名称3',N'规格4',7)
    insert into @t values(N'名称4',N'规格4',8)
    
    
    select *
    from (
    select 名称,规格,数量
    from @t
    union all
    select 名称 + N' 汇总' as 名称,'' as 规格,SUM(数量) as 数量
    from @t
    group by 名称
    		) t
    order by 名称


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    • 已标记为答案 sdfr2342 2012年2月10日 3:58
    2012年2月10日 2:20
  • 谢谢,基本满足要求。但是缺少一个最后的总合计数。
    2012年2月10日 3:58
  • 借用Terry大哥的测试数据

     

    declare @t table
    (
    	名称	 nvarchar(10)
    	,规格 nvarchar(10)
    	,数量 int
    )
    
    insert into @t values(N'名称1',N'规格1',1)
    insert into @t values(N'名称1',N'规格2',2)
    insert into @t values(N'名称1',N'规格3',3)
    insert into @t values(N'名称2',N'规格2',4)
    insert into @t values(N'名称2',N'规格4',5)
    insert into @t values(N'名称3',N'规格1',6)
    insert into @t values(N'名称3',N'规格4',7)
    insert into @t values(N'名称4',N'规格4',8)
    
    
    Select Case 
         When 名称 Is Not NULL And 规格 is null 
         Then 名称 + N' 汇总' 
         when 名称 Is Null And 规格 is null 
         Then N'总计' 
    Else 名称 
    End As 名称,规格,SUM(数量) As 数量
    from @t
    Group by 名称,规格
    With rollup
    Order by 名称

    Result:


    2012年2月10日 4:05
  • 谢谢 Shadow And Happy Code 。示例数据通过测试,实际表格比上面还多了很多列比如长、宽、高等。但是分类只需要名称即可。

    所以执行时会提示“在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。”

    2012年2月10日 6:11
  • 谢谢,基本满足要求。但是缺少一个最后的总合计数。

    不好意思,漏掉了。

    declare @t table
    (
    	名称	 nvarchar(10)
    	,规格 nvarchar(10)
    	,数量 int
    )
    
    insert into @t values(N'名称1',N'规格1',1)
    insert into @t values(N'名称1',N'规格2',2)
    insert into @t values(N'名称1',N'规格3',3)
    insert into @t values(N'名称2',N'规格2',4)
    insert into @t values(N'名称2',N'规格4',5)
    insert into @t values(N'名称3',N'规格1',6)
    insert into @t values(N'名称3',N'规格4',7)
    insert into @t values(N'名称4',N'规格4',8)
    
    
    select *
    from (
    select 名称,规格,数量
    from @t
    union all
    select 名称 + N' 汇总' as 名称,'' as 规格,SUM(数量) as 数量
    from @t
    group by 名称
    union all
    select N'总计'  ,'' ,SUM(数量) as 数量
    from @t
    		) t
    order by 名称
    不過我的寫法雖可得到您要的結果,建議或許Shadow大所用的Group By with Rollup會比較漂亮。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年2月10日 6:21