Как преобразовать столбцы в строки в Sql Server 2008 R2?

у меня такая таблица

введите здесь описание изображения

и результат должен быть таким

введите здесь описание изображения

Я немного запутался в Pivot, unpivot и перекрестном применении. может ли кто-нибудь помочь мне в этом.


person Anjali    schedule 08.12.2013    source источник


Ответы (2)


Вы выполняете поворот по двум столбцам (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]

Живой пример на SQL Fiddle.

person Andomar    schedule 08.12.2013

Вы можете использовать функцию 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 |
person Taryn    schedule 09.12.2013