Помощь SQL-запросов с помощью Pivot - PullRequest
1 голос
/ 29 августа 2011

У меня есть следующая таблица:

PriorityText  Priority  LoRes   Partial  Unknown  N_A      HiRes
------------------------------------------------------------------
Very High     5         0.0612  0.0000   0.0612   0.0612   0.2041
High          4         0.1429  0.0000   0.1633   0.0000   0.1633
Medium        3         0.0000  0.0000   0.1020   0.0000   0.0408
Low-Medium    2         0.0000  0.0000   0.0000   0.0000   0.0000
Low           1         0.0000  0.0000   0.0000   0.0000   0.0000

Я пытаюсь перенести tbale в это:

PriorityText  Low  Low-Medium  Medium  High    Very High
--------------------------------------------------------
Priority      1    2           3       4       5
LoRes         0    0           0       0.1429  0.0612
Partial       0    0           0       0       0
Unknown       0    0           0.102   0.1633  0.0612
N_A           0    0           0       0       0.0612
HiRes         0    0           0.0408  0.1633  0.2041

Я использую SQL 2008. У меня проблемы с созданием синтаксиса SQL для выполнения разворота данных.

Может кто-нибудь поделиться фрагментом SQL, который решит это для меня?

Я использовал следующее для успешного поворота одной строки, но я не знаю, как заставить все мои ряды сделать это.

SELECT VeryHigh AS VeryHigh, 
       High AS High, 
       Medium AS Medium, 
       [Low-Medium] AS [Low-Medium], 
       Low AS Low
 FROM  (SELECT [PriorityText], [LoRes], [Low-Medium], [Medium], [High], [VeryHigh] 
          FROM @tbTemp) p
PIVOT (SUM(LoRes) FOR [PriorityText] in ([VeryHigh], [High], [Medium], [Low-Medium], [Low])) pvt

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

Priority PriorityText   LoRes   Partial  Unknown   N_A    HiRes
1        VeryHigh       0.05    11       54        0      9
2        High           0.14    22       54        0      3
3        Medium         0.07    33       65        0      7
4        Low-Medium     0.01    44       87        0      4
5        Low            0       55       9         0      0
NULL     NULL           NULL    NULL     NULL      NULL   NULL

Спасибо за любую помощь !!

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Вам необходимо UNPIVOT данных и затем повторно PIVOT значения, используя нужные заголовки столбцов:

SELECT  pvt.*
FROM
(    
    SELECT  unpvt.PriorityText
            ,unpvt.PriorityText2
            ,unpvt.MyValueMyValue
    FROM    SourceTable src
    UNPIVOT( MyValueMyValue FOR PriorityText2 IN ([Priority],[LoRes],[Partial],[Unknown],[N_A],[HiRes]) ) unpvt
) src2
PIVOT( MAX(src2.MyValueMyValue) FOR src2.PriorityText IN ([Low],[Low-Medium],[Medium],[High],[Very High]) ) pvt
0 голосов
/ 01 сентября 2011

Это решение довольно уродливо, но я думаю, что оно сделает то, о чем вы просите, и довольно просто. Существуют более элегантные и динамичные способы переноса данных с помощью динамического SQL и XML.

например http://sql -tricks.blogspot.com / 2011/04 / sql-server-row-transpose.html

-- POPULATE SAMPLE DATA
DECLARE @tbTemp table (PriorityText varchar(50), Priority float, LoRes float, Partial float, Unknown float, N_A float, HiRes float)

insert into @tbTemp (PriorityText,Priority,LoRes,Partial,Unknown,N_A, HiRes)
values 
    ('Very High',5,0.0612,0.0000,0.0612,0.0612,0.2041),
    ('High',4,0.1429,0.0000,0.1633,0.0000,0.1633),
    ('Medium',3,0.0000,0.0000,0.1020,0.0000,0.0408),
    ('Low-Medium',2,0.0000,0.0000,0.0000,0.0000,0.0000),
    ('Low',1,0.0000,0.0000,0.0000,0.0000,0.0000)

;

with sourcetable ([Key],ColumnName,Value) -- Transposing into key/value-pair for each column
as
(
    select 'Priority', PriorityText, Priority from @tbTemp
    union all
    select 'LoRes', PriorityText, LoRes from @tbTemp
    union all
    select 'Partial', PriorityText, Partial from @tbTemp
    union all
    select 'Unknow', PriorityText, Unknown from @tbTemp
    union all
    select 'N_A', PriorityText, N_A from @tbTemp
    union all
    select 'HiRes', PriorityText, HiRes from @tbTemp
) 
select 
    grouptable.PriorityText,
        (select Value from sourcetable 
        where sourcetable.ColumnName = 'Low' 
        and sourcetable.[Key] = grouptable.PriorityText) as Low,
        (select Value from sourcetable 
        where sourcetable.ColumnName = 'Low-Medium' 
        and sourcetable.[Key] = grouptable.PriorityText) as [Low-Medium],
        (select Value from sourcetable 
        where sourcetable.ColumnName = 'Medium' 
        and sourcetable.[Key] = grouptable.PriorityText)as Medium,
        (select Value from sourcetable 
        where sourcetable.ColumnName = 'High' 
        and sourcetable.[Key] = grouptable.PriorityText) as High,
        (select Value from sourcetable 
        where sourcetable.ColumnName = 'Very High' 
        and sourcetable.[Key] = grouptable.PriorityText) as [Very High]
    from (
        select 'Priority' as PriorityText
        union all
        select 'LoRes' as PriorityText
        union all
        select 'Partial' as PriorityText
        union all
        select 'Unknow' as PriorityText     
        union all
        select 'N_A' as PriorityText        
        union all
        select 'HiRes' as PriorityText      
    ) grouptable -- Creating each row
...