#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
Перекрестное применение будет отменено, и агрегаты будут сводить данные для вас.