#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, создающий сводные элементы.