у меня такая таблица
и результат должен быть таким
Я немного запутался в Pivot, unpivot и перекрестном применении. может ли кто-нибудь помочь мне в этом.
у меня такая таблица
и результат должен быть таким
Я немного запутался в Pivot, unpivot и перекрестном применении. может ли кто-нибудь помочь мне в этом.
Вы выполняете поворот по двум столбцам (department, [check/uncheck])
. Насколько мне известно, это означает, что вы не можете использовать синтаксис SQL Server pivot
.
Один из способов — «развернуть» (иначе «нормализовать») checked
в подзапросе. Затем вы можете «повернуть» (иначе «денормализировать») столбец tools
во внешнем запросе:
select department
, [Check/Uncheck]
, sum(case when tools = 'engine' then nr else 0 end) as engine
, sum(case when tools = 'oils' then nr else 0 end) as oils
, sum(case when tools = 'grease' then nr else 0 end) as grease
, sum(case when tools = 'sounds' then nr else 0 end) as sounds
, sum(case when tools = 'wapers' then nr else 0 end) as wapers
from (
select department
, tools
, 'Checked' as [Check/Uncheck]
, checked as nr
from dbo.YourTable
union all
select department
, tools
, 'Unchecked'
, unchecked
from dbo.YourTable
) as SubQueryAlias
group by
Department
, [Check/Uncheck]
order by
Department
, [Check/Uncheck]
Вы можете использовать функцию PIVOT, чтобы получить результат, но сначала вам нужно развернуть столбцы unchecked
и checked
. Поскольку вы используете SQL Server 2008r2, вы можете использовать CROSS APPLY для UNPIVOT столбцов в несколько строк.
Основной синтаксис для CROSS APPLY будет следующим:
select department, tools,
[check/uncheck],
value
from yourtable
cross apply
(
values
('checked', checked),
('unchecked', unchecked)
) c([check/uncheck], value);
См. Демонстрацию, это преобразует ваши данные в формат:
| DEPARTMENT | TOOLS | CHECK/UNCHECK | VALUE |
|------------|--------|---------------|-------|
| Maintain | engine | checked | 0 |
| Maintain | engine | unchecked | 0 |
| Maintain | oils | checked | 0 |
| Maintain | oils | unchecked | 2 |
Как только данные будут преобразованы в этот формат, вы можете использовать функцию PIVOT, чтобы превратить ваши tools
в столбцы:
select department,
[check/uncheck],
engine, oils, grease, sounds, wapers
from
(
select department, tools,
[check/uncheck],
value
from yourtable
cross apply
(
values
('checked', checked),
('unchecked', unchecked)
) c([check/uncheck], value)
) d
pivot
(
sum(value)
for tools in (engine, oils, grease, sounds, wapers)
) piv
order by department;
См. SQL Fiddle с демонстрацией. Это даст результат:
| DEPARTMENT | CHECK/UNCHECK | ENGINE | OILS | GREASE | SOUNDS | WAPERS |
|------------|---------------|--------|------|--------|--------|--------|
| Maintain | checked | 0 | 0 | 5 | 0 | 0 |
| Maintain | unchecked | 0 | 2 | 1 | 0 | 0 |
| Operations | checked | 1 | 2 | 1 | 5 | 0 |
| Operations | unchecked | 0 | 1 | 2 | 1 | 2 |