SQL Pivot / Распаковка

#sql #sql-server #tsql #pivot #unpivot

Вопрос:

У меня есть приведенный ниже результат, и я попытался отменить вызов, чтобы переместить все столбцы в строки и получить значения из квартала в виде столбцов, но, как бы я ни старался, я не получаю желаемого результата.

Я надеюсь, что кто-нибудь сможет указать мне правильное направление, потому что поворот/разворот сильно меня смущает.

Текущие данные:

 Qarter    Fatal incidents    PSC Detentions    Oil spill to Sea
Q1 2021   0                  0                 1
Q2 2021   1                  1                 1
Q3 2021   0                  0                 0
 

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

                      Q1 2021     Q2 2021     Q3 2021
Fatal incidents      0           1           0
PSC Detentions       0           1           0
Oil spill to sea     1           1           0   
 

Комментарии:

1. каков ваш желаемый результат ?

2. Инциденты со смертельным исходом, Задержание PSC, PSC Insp, Разлив нефти, Промах, СИР, CDI, LTI,RWC, MTC и Человеко-часы в строках 1 квартал 2021 года, 2 квартал 2021 года, 3 квартал 2021 года и 4 квартал 2021 года в столбцах

3. В соответствии с руководством по вопросам, пожалуйста, НЕ размещайте изображения кода, данных, сообщений об ошибках и т.д. — Скопируйте или введите текст в вопрос. Пожалуйста, зарезервируйте использование изображений для диаграмм или демонстрации ошибок рендеринга, вещей, которые невозможно точно описать с помощью текста.

4. Я сожалею, Дейл, что опубликовал изображение, я не очень хорошо знаком с тем, как правильно представлять данные здесь, вот почему он это сделал

5. Я обновил данные с табличным видом

Ответ №1:

Это отвечает на исходную версию вопроса.

Похоже, вам нужны все столбцы, кроме второго, который превращается в два:

 select t.quarter, t.psc_detentions, t.oil_spill_sea, . . .,
       v.marks, v.q
from t cross apply
     (values ('Fatal incidents', Fatal_incidents)
     ) v(q, marks);
 

Обратите внимание, что для этого простого примера вам на самом деле даже не нужно apply :

 select t.quarter, t.psc_detentions, t.oil_spill_sea, . . .,
       Fatal_incidents as marks, 'Fatal incidents' as q
from t;
 

Однако я предполагаю, что у вас есть несколько столбцов, которые вы хотите обработать таким образом, поэтому я предлагаю apply .

Комментарии:

1. При этом все столбцы по-прежнему отображаются как столбцы. Я хочу, чтобы все столбцы стали строками, а строки-столбцами

2. @Pochen . . . В вашем вопросе есть два изображения таблиц (я должен добавить, что изображения не рекомендуется использовать для таких целей; используйте текстовые таблицы или DDL). Предположительно, первое-это исходные данные, а второе — желаемые результаты. Если нет, то ваш вопрос неясен, и я могу проголосовать за закрытие.

3. Я обновил сообщение структурированными данными. Извините за путаницу

Ответ №2:

Вы можете попробовать сначала открепить данные, а затем повернуть.

 select      ca.Type
            , max(case when t.Qarter = 'Q1 2021' then ca.Value end) as [Q1 2021]
            , max(case when t.Qarter = 'Q2 2021' then ca.Value end) as [Q2 2021]
            , max(case when t.Qarter = 'Q3 2021' then ca.Value end) as [Q3 2021]
from        dbo.Table1                                             as t
cross apply (   values ('Fatal incidents', [Fatal incidents])
                       , ('PSC Detentions', [PSC Detentions])
                       , ('Oil spill to Sea', [Oil spill to Sea])) as ca ([Type], [Value])
group by    ca.Type
 

Перекрестное применение будет отменено, и агрегаты будут сводить данные для вас.