Я пытаюсь развернуть таблицу в SQL Server (более 52 млн наблюдений), однако не получаю нужных мне результатов. Есть 15 описаний, каждое со значением, которое мне нужно повернуть.

Исходный кадр данных:

ID         |  Date      | Description| Value 
-------------------------------------------------
P1         | 2016-12-31 |       ABC  |         900
P2         | 2016-11-30 |       XYZ  |         800
P3         | 2016-10-31 |       MNO  |         700

Желаемые результаты

ID         |  Date      | ABC | XYZ  | MNO 
-------------------------------------------------
P1         | 2016-12-31 | 900  |     | 
P2         | 2016-11-30 |      | 800 |     
P3         | 2016-10-31 |      |     | 700

Я попытался развернуть это в PySpark и SQL, но не получил рабочего результата.

Попытка SQL:

SELECT [Date]
      ,[ID]
      ,[Description]
      ,[Value]
  FROM [DB].[TABLE]
  WHERE ( ([Description] IN ('ABC','XYZ', 'MNO'))
  PIVOT(
    COUNT([Value]) 
    FOR Description IN (
        [ABC], 
        [XYZ], 
        [MNO])
) AS pivot_table;

Я пробовал это в Pyspark, но это тоже не работает:

df.groupBy("ID","Date").pivot("Description").sum("Value")
2
Starbucks 2 Сен 2020 в 22:55

2 ответа

Лучший ответ

Используйте условную агрегацию:

select
    id,
    date,
    max(case when description = 'ABC' then value end) as abc,
    max(case when description = 'DEF' then value end) as def,
    max(case when description = 'MNO' then value end) as mno
from mytable
group by id, date
3
GMB 2 Сен 2020 в 20:00

Оператор поворота идет сразу после таблицы в предложении FROM. Чтобы поместить предложение WHERE, вам нужно будет поместить сводную исходную таблицу в подзапрос или общее табличное выражение.

Кроме того, вы не можете выводить столбцы Описание и Значение во внешнем выборе, потому что теперь они сгруппированы по сводной таблице.

Попробуйте так:

SELECT [Date],
        [ID], 
        [ABC], 
        [XYZ], 
        [MNO]
FROM
(
    SELECT [Date]
          ,[ID]
          ,[Description]
          ,[Value]
      FROM [DB].[TABLE]
      WHERE ([Description] IN ('ABC','XYZ', 'MNO'))
) AS SourceTable 
 PIVOT(
    COUNT([Value]) 
    FOR Description IN (
        [ABC], 
        [XYZ], 
        [MNO])
) AS PivotTable;
1
user2414025 2 Сен 2020 в 20:33