2014-01-31 6 views
2

Считает, что у меня есть таблица, которая содержит данные в следующем виде:Multi-Column, многорядный PIVOT

Foo_FK MonthCode_FK Activity_FK SumResultsX SumResultsY 
----------------------------------------------------------- 
1  201312  0   10   2 
1  201312  1   5   1 
1  201401  0   15   3 
1  201401  1   7   2 
2  201312  0   9   3 
2  201312  1   1   2 
2  201401  0   6   2 
2  201401  1   17   4 

Для моих целей, то можно предположить, что эта таблица представляет собой совокупность, которая будет иметь был создан GROUP BY по адресу Foo_FK, MonthCode_FK, Activity_FK с SUM(ResultsA), SUM(ResultsB) для получения данных, что делает Foo_FK, MonthCode_FK, Activity_FK уникальным для каждой записи.

Если по какой-то причине я счел предпочтительным PIVOT эту таблицу в хранимой процедуре, чтобы облегчить процесс завинчивания с помощью SSRS, который я должен был бы сделать (и, несомненно, позже поддерживать), желая получить следующий формат для потребления через матрицу tablix thingy:

Foo_FK 1312_0_X 1312_0_Y 1312_1_X 1312_1_Y 1401_0_X 1401_0_Y 1401_1_X 1401_1_Y 
-------------------------------------------------------------------------------------- 
1  10  2   5   1   15  3   7   2 
2  9   3   1   2   6   2   17  4 

Как бы я делал это не мысленно? Пожалуйста, обратитесь к этому SQL Fiddle в доказательство, что я, вероятно, пытаюсь использовать молоток, чтобы построить устройство, которое толкает в гвоздях. Не беспокойтесь о динамической версии, так как я уверен, что смогу понять это, как только я руководствуюсь статическим решением для этого теста.

Прямо сейчас, я пытался создать Foo_FK, MonthCode_FK установить с помощью следующих, которые я тогда попытка PIVOT (see the Fiddle for the full mess):

SELECT Foo_FK = ISNULL(a0.Foo_FK, a1.Foo_FK), 
     MonthCode_FK = ISNULL(a0.MonthCode_FK, a1.MonthCode_FK), 
     [0_X] = ISNULL(a0.SumResultX, 0), 
     [0_Y] = ISNULL(a0.SumResultY, 0), 
     [1_X] = ISNULL(a1.SumResultX, 0), 
     [1_Y] = ISNULL(a1.SumResultY, 0) 
FROM ( SELECT Foo_FK, MonthCode_FK, Activity_FK, 
       SumResultX, SumResultY 
     FROM dbo.t_FooActivityByMonth 
     WHERE Activity_FK = 0) a0 
FULL OUTER JOIN (
     SELECT Foo_FK, MonthCode_FK, Activity_FK, 
       SumResultX, SumResultY 
     FROM dbo.t_FooActivityByMonth 
     WHERE Activity_FK = 1) a1 
    ON a0.Foo_FK = a1.Foo_FK; 

я пришел через некоторое excellent advice on this SO question, так что я в процесс выполнения какой-либо формы UNPIVOT, прежде чем я верну все, используя PIVOT и MAX, но если есть лучший способ сделать это, я все уши.

ответ

3

кажется, что вы должны быть в состоянии сделать это, применив UNPIVOT к вашим SumResultX и SumResultY столбцов, а затем поворачиваясь данные:

;with cte as 
(
    select Foo_FK, 
    col = cast(MonthCode_FK as varchar(6))+'_' 
      +cast(activity_fk as varchar(1))+'_'+sumresult, 
    value 
    from dbo.t_FooActivityByMonth 
    cross apply 
    (
    values 
     ('X', SumResultX), 
     ('Y', SumResultY) 
) c (sumresult, value) 
) 
select Foo_FK, 
    [201312_0_X], [201312_0_Y], [201312_1_X], [201312_1_Y], 
    [201401_0_X], [201401_0_Y], [201401_1_X], [201401_1_Y] 
from cte 
pivot 
(
    max(value) 
    for col in ([201312_0_X], [201312_0_Y], [201312_1_X], [201312_1_Y], 
       [201401_0_X], [201401_0_Y], [201401_1_X], [201401_1_Y]) 
) piv; 

См SQL Fiddle with Demo