Как выразить этот запрос в SQL Server 2008

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть таблица под названием Reporting со следующими столбцами

 OutletId CampaignId    ItemId  Qty  
10          1          Item1   12    
10          1          Item2   13    
10          1          Item3   14    
20          2          Item4   10    
20          2          Item5   11    
20          2          Item6   12    
20          2          Item7   8    
  

Теперь я хочу получить данные в этом формате
, когда пользователь выбирает CampaignID = 1

 OutletId   CampaignId  Item1  Item2   Item3  
10            1         12     13       14  
  

когда пользователь выбирает CampaignID= 2

 OutletId   CampaignId Item4 Item5 Item6 Item7   
20            2         10    11   12    8
  

Здесь элементы для campaign не являются фиксированными

Комментарии:

1. вам следует переосмыслить дизайн, поскольку это будет невозможно (динамическое количество столбцов) и очень неэффективно…

2. @Yahia: поворот не совсем невозможен, но вы правы. Возможно, переосмысление дизайна является лучшим вариантом

3. @LukasEder вы правы, поворот — это вариант… хотя и не очень эффективно…

4. @Yahia пожалуйста, проверьте мой ответ, и я думаю, что вы измените свое решение…

5. @Tareq как я уже говорил в своем последнем комментарии — это возможно, но неэффективно (производительность и т.д.)

Ответ №1:

Я думаю, что это эффективно таким образом:

 SELECT *
FROM
(
    SELECT OutletId, CampaignId, ItemId, Qty
FROM Reporting) AS p
PIVOT
(
    SUM(Qty)
    FOR ItemId IN (SELECT ItemId FROM Reporting WHERE campaignId =1) 
) as pvt
  

Comment: Here campaignId =1 or campaignId =2 or campaignId =... whatever u want

Ответ №2:

Возможным решением было бы:

 SELECT *
FROM
(
SELECT OutletId, CampaignId,ItemId, Qty
FROM test) AS p
PIVOT
(
    SUM(Qty)
    FOR ItemId IN (Item1,Item2,Item3,Item4)
) as pvt
  

Но, очевидно, что, как указано ранее, это не очень эффективно, потому что вы не всегда знаете элементы… вы либо перепроектируете свою таблицу, либо, используя PIVOT, вы можете предварительно создать динамический sql, создающий сводные элементы.