跨列和行求和

Sum across columns and rows

考虑这样的 table

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

现在我想获取按书籍分组的每个项目的列数量总和。那我怎样才能把不同列的总和呢?现在我使用一个笨拙的解决方案,比如构建一个临时 table 然后查询这个,但它必须以更优雅的方式实现!?

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 |
+--------+--------+----------+

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

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

使用 cross applytable valued constructorunpivot 数据,然后根据 bookiditem 找到 sum

这将避免您的中间步骤

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