跨列和行求和

时间:2015-02-27 08:35:12

标签: sql sql-server sql-server-2005 sum sybase-ase

考虑像这样的表

table
+--------+---------+-----------+---------+-----------+
| BookId | ItemId1 | Quantity1 | ItemId2 | Quantity2 |
+--------+---------+-----------+---------+-----------+
|      1 |       1 |         2 |       2 |         1 |
|      1 |       3 |         1 |       2 |         1 |
|      2 |       1 |         1 |       2 |         1 |
+--------+---------+-----------+---------+-----------+

现在我想得到按书分组的每个项目的列数量总和。那么如何在不同的列中得到总和呢?现在我使用一个笨拙的解决方案,比如构建一个临时表,然后查询这个,但它必须以更优雅的方式实现!?

select
    BookId 'BookId',
    ItemId1 'ItemId',
    Quantity1 'Quantity'
into #temptab
from table
union all
select
    BookId,
    ItemId2,
    Quantity2
from table

之后

select 
    BookId,
    ItemId,
    sum(Quantity)
from #temptab
group by ItemId, BookId

如何摆脱这个中间步骤?

期望的输出:

+--------+--------+----------+
| BookId | ItemId | Quantity |
+--------+--------+----------+
|      1 |      1 |        2 |
|      1 |      3 |        1 |
|      1 |      2 |        2 |
|      2 |      1 |        1 |
|      2 |      2 |        1 |
+--------+--------+----------+

2 个答案:

答案 0 :(得分:4)

cross applytable valued constructor一起使用unpivot数据,然后按sumbookid查找item

这将避免您的中间步骤

SELECT BookId,
       item,
       Sum(quantity)
FROM   Youratble
       CROSS apply (VALUES(Quantity1,ItemId1),
                          (Quantity2,ItemId2))cs(quantity, item)
GROUP  BY BookId,
          item 

正如Mikael Eriksson所提到的sql server 2005使用此

SELECT BookId,
       item,
       Sum(quantity)
FROM   Youratble
       cross apply 
            (select Quantity1, ItemId1 
             union all 
             select Quantity2, ItemId2) as cs(quantity, item)
GROUP  BY BookId,
          item 

答案 1 :(得分:0)

根据您所做的事情,您可以使用子查询一步完成:

select 
combined.BookId,
combined.ItemId,
sum(combined.Quantity)
from 
  (select
   BookId 'BookId',
   ItemId1 'ItemId',
   Quantity1 'Quantity'
   from tableName
   union all
   select
   BookId,
   ItemId2,
   Quantity2
   from tableName) as combined
group by combined.ItemId, combined.BookId