2015-02-27 4 views
1

Рассмотрим таблицу, как этогоСумма по столбцам и строкам

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

Если ItemId1 соответствует ItemId2, вы хотите их сложить вместе? – Pinx0

+0

Используйте команду UNPIVOT. –

+0

@ Pinx0 yes right –

ответ

4

Использование cross apply с table valued constructor до unpivot данных, то найти sum за bookid и item.

Это позволит избежать вашего промежуточного этапа

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

Как отметил Микаэль Эрикссона для 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 
+2

Я испортил и поместил bookId в свой крест. Удалено мое решение и + 1 –

+0

Спасибо. Тем не менее, я получаю сообщение об ошибке «Неправильный синтаксис рядом с ключевыми словами« значения ». Похоже, что конструктор с табличным значением был создан только в SQL Server 2008, я использую 2005. У вас есть решение для этого? –

+0

@WilliFischer Изменить использовать union all вместо 'cross apply (выберите Quantity1, ItemId1 union all Quantity2, ItemId2) как cs (количество, элемент)' –

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

. Хотелось бы избежать подзапроса. Спасибо в любом случае –

Смежные вопросы