#sql
#sql
Вопрос:
У меня есть таблица, которая выглядит как показано ниже. Значения представляют собой количество контрактов, которые каждый клиент имеет каждый месяц.
CustomerNo | CustomerType | 201901 | 201902 | 201903 |
----------- --------------- ---------- ---------- ----------|
1 | Private | 1 | 0 | 0 |
2 | Private | 0 | 1 | 1 |
3 | Enterprise | 1 | 1 | 0 |
4 | Enterprise | 1 | 1 | 1 |
Я хочу отключить столбцы YearMonth и сгруппировать по CustomerType, YearMonth, чтобы таблица выглядела так:
CustomerType | YearMonth | Contracts |
------------- ----------- -----------|
Private | 201901 | 1 |
Enterprise | 201901 | 2 |
Private | 201902 | 1 |
Enterprise | 201902 | 2 |
Private | 201903 | 1 |
Enterprise | 201903 | 1 |
Как
Комментарии:
1. Что вы сделали до сих пор? Какой поставщик базы данных?
2. какую СУБД вы используете?
Ответ №1:
Я бы просто использовал apply
:
select v.*
from t cross apply
(values (t.customerType, 201901, t.[201901]),
(t.customerType, 201902, t.[201902]),
(t.customerType, 201903, t.[201903])
) v(CustomerType, YearMonth, Contracts)
where Contracts > 0;
Я предпочитаю apply
, потому что это хорошее введение в боковые соединения, очень удобная функциональность в базах данных SQL.
Альтернативой unpivot
является синтаксис на заказ, и он выполняет только одну вещь (и, на мой взгляд, тоже не очень элегантно).
Ответ №2:
Для MS SQL Server:
SELECT CustomerType, YearMonth, SUM(Contracts) Contracts
FROM (
SELECT CustomerNo, CustomerType, [201901], [201902], [201903]
FROM Customers
) pvt
UNPIVOT(Contracts FOR YearMonth IN([201901], [201902], [201903])) unpvt
GROUP BY CustomerType, YearMonth;
Результат:
CustomerType YearMonth Contracts
Enterprise 201901 2
Private 201901 1
Enterprise 201902 2
Private 201902 1
Enterprise 201903 1
Private 201903 1
Ссылка на db<>fiddle
Документация MSDN: ОТКЛЮЧИТЬ