Помощь, необходимая для поворота данных без агрегатов в SQL Server 2008 - PullRequest
1 голос
/ 06 июня 2011

Мне нужно повернуть таблицу следующим образом: исходная таблица выглядит следующим образом

GEO PRD PACK    DATATYPE    Sales1  Sales2

T1  P1  M1  22          1     2

T1  P1  M1  23          2     8

T1  P1  M1  24          3     5

T2  P2  M2  22          3     2

T2  P2  M2  23          1     4

T2  P2  M2  24          1     7

и что я хочу это:

GEO PRD PACK 22_Sales1 22_Sales2 23_Sales1 23_Sales2 24_Sales1 24_Sales2

T1  P1  M1       1         2         2         8         3         5

T2  P2  M2       3         2         1         4         1         7

здесь фиксированный ДАННЫЙ ТИП: всегда будет: 22, 23, 24, не меньше и не больше.

Пожалуйста, кто-нибудь может мне помочь, как написать правильный запрос?

Ответы [ 3 ]

0 голосов
/ 06 июня 2011

Последние версии SQL Server имеют функцию PIVOT .

Вот пример того, как выполнить поворот в нескольких версиях SQL Server.

И есть много хороших ответов на этот очень популярный вопрос SO: Примеры SQL Server PIVOT?

Вот пример из этой страницы того, как выглядит простой оператор PIVOT:

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt
0 голосов
/ 16 августа 2012

Чтобы использовать PIVOT с вашими данными, вы должны использовать следующее. Сначала выполняется UNPIVOT, а затем PIVOT, чтобы получить данные в нужном формате:

create table t1
(
    geo varchar(2),
    prd varchar(2),
    pack varchar(2),
    datatype int,
    sales1 int,
    sales2 int
)
insert into t1 values ('T1', 'P1', 'M1', 22, 1, 2)
insert into t1 values ('T1', 'P1', 'M1', 23, 2, 8)
insert into t1 values ('T1', 'P1', 'M1', 24, 3, 5)
insert into t1 values ('T2', 'P2', 'M2', 22, 3, 2)
insert into t1 values ('T2', 'P2', 'M2', 23, 1, 4)
insert into t1 values ('T2', 'P2', 'M2', 24, 1, 7)

select *
from 
(
    select geo, prd, pack, cast(datatype as varchar(5)) + '_' + col col,value
    from t1
    unpivot
    (
        value
        for col in (sales1, sales2)
    ) u
) x
pivot
(
    sum(value)
    for col in ([22_sales1], [22_sales2], [23_Sales1], [23_Sales2], [24_Sales1], [24_Sales2])
) p

См. SQL Fiddle с демоверсией

0 голосов
/ 06 июня 2011
select geo, prd, pack,   
  sum(sales_22_1) sales_22_1,
  sum(sales_22_2) sales_22_2,
  sum(sales_23_1) sales_23_1,
  sum(sales_23_2) sales_23_2,
  sum(sales_24_1) sales_24_1, 
  sum(sales_24_2) sales_24_2 
from
(select geo, prd, pack, 
  (case when datatype = 22 then sales1
   else null
   end) as sales_22_1,
(case when datatype = 22 then sales2
   else null
   end) as sales_22_2,
(case when datatype = 23 then sales1
   else null
   end) as sales_23_1,
(case when datatype = 23 then sales2
   else null
   end) as sales_23_2,
(case when datatype = 24 then sales1
   else null
   end) as sales_24_1,
(case when datatype = 24 then sales2
   else null
   end) as sales_24_2
 from mytab)
group by geo, prd, pack

(не проверено, поскольку у меня нет доступного экземпляра сервера SQL).

...