Как сделать PIVOT в SQL Server, выполняя агрегирование по нескольким столбцам - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь использовать PIVOT в SQL Server для получения вывода данных в требуемом формате.

Мои текущие данные выглядят так:

Исходные данные:

+------------+---------+---------+-------+-----------+------------+
| CustomerID | SalesID | Product | Brand | SellPrice | Commission |
+------------+---------+---------+-------+-----------+------------+
| 1          | 1       | Mobile  | XYZ   | 600.00    | 60.00      |
| 1          | 1       | TV      | ABC   | 500.00    | 50.00      |
| 1          | 1       | Laptop  | ZXC   | 300.00    | 30.00      |
| 1          | 1       | Mobile  | XYZ   | 400.00    | 8.0        |
| 1          | 1       | Laptop  | ZXC   | 300.00    | 12.00      |
+------------+---------+---------+-------+-----------+------------+

Ищем запрос с PIVOT, который вернет данные в следующем формате:

+------------+---------+-------------------------+---------------------+-------------------------+---------------------+---------------------+---------------------+
| CustomerID | SalesID | Total_Mobile_Commission | Total_TV_Commission | Total_Laptop_Commission | Total_XYZ_Sell_Pric | Total_ABC_SellPrice | Total_ZXC_SellPrice |
+------------+---------+-------------------------+---------------------+-------------------------+---------------------+---------------------+---------------------+
| 1          | 1       | 68.00                   | 50.00               | 42.00                   | 1000.00             | 500.00              | 600.00              |
+------------+---------+-------------------------+---------------------+-------------------------+---------------------+---------------------+---------------------+

1 Ответ

1 голос
/ 12 мая 2019

Я бы не использовал для этого ключевое слово pivot, но я не часто его использую;Я нахожу метод группового случая, когда поворот более легким для понимания и более гибким:

SELECT
  CustomerID,
  SalesID,
  SUM(CASE WHEN product = 'mobile' then commission END) as Total_Mobile_Commission
  SUM(CASE WHEN product='tv' THEN comission END) as Total_TV_Commission,
  SUM(CASE WHEN product = 'laptop' THEN commission END) as Total_Laptop_Commission,
  SUM(CASE WHEN brand = 'xyz' THEN sellprice END as Total_XYZ_Sell_Pric,
  SUM(CASE WHEN brand = 'abc' THEN sellprice END) as Total_ABC_SellPrice,
  SUM(CASE WHEN brand = 'zxc' THEN sellprice END)  as Total_ZXC_SellPrice
FROM table
GROUP BY customerid, salesid

Если вы хотите больше узнать о том, как он работает, запустите его без группировки по и суммируйте ключевые слова, чтобы он нене делать агрегирование (и добавлять в столбцы бренда и продукта).Вы увидите, что ваши данные распределены из 4-столбчатой ​​формы продукта / бренда / цены / комиссии в столбец, который содержит только мобильную комиссию или ноль, другой столбец, который содержит только телевизионную комиссию или ноль и т. Д .;Всего 6 столбцов, которые в большинстве случаев являются нулевыми, но имеют значение, когда бренд или продукт соответствуют названию столбца.Суммируя это, можно свести к одной строке для каждого обычного / торгового агента, уничтожив все нули

...