Отключить несколько столбцов и сгруппировать по

#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: ОТКЛЮЧИТЬ