2012-04-05 12 views
11

Mam tabeli jak to w mojej bazy danych (SQL Server 2008)Jak przestawiać kolumny tekstowe w SQL Server?

ID  Type   Desc 
-------------------------------- 
C-0 Assets   No damage 
C-0 Environment  No impact 
C-0 People   No injury or health effect 
C-0 Reputation  No impact 
C-1 Assets   Slight damage 
C-1 Environment  Slight environmental damage 
C-1 People   First Aid Case (FAC) 
C-1 Reputation  Slight impact; Compaints from local community 

mam do wyświetlania aktywa, ludzie, środowiska i reputacji jako kolumny i wyświetlacz dopasowane opis produktu jako wartości. Ale po uruchomieniu kwerendy przestawnej wszystkie moje wartości są puste.

Czy ktoś może zajrzeć do mojego zapytania i powiedzieć, co robię źle?

Select severity_id,pt.[1] As People, [2] as Assets , [3] as Env, [4] as Rep 
FROM 
(
    select * from COMM.Consequence 
) As Temp 
PIVOT 
(
    max([DESCRIPTION]) 
    FOR [TYPE] In([1], [2], [3], [4]) 
) As pt 

Oto moje wyjście

ID People Assets Env  Rep 
----------------------------------- 
C-0 NULL NULL NULL NULL 
C-1 NULL NULL NULL NULL 
C-2 NULL NULL NULL NULL 
C-3 NULL NULL NULL NULL 
C-4 NULL NULL NULL NULL 
C-5 NULL NULL NULL NULL 

Odpowiedz

20
Select severity_id, pt.People, Assets, Environment, Reputation 
FROM 
(
    select * from COMM.Consequence 
) As Temp 
PIVOT 
(
    max([DESCRIPTION]) 
    FOR [TYPE] In([People], [Assets], [Environment], [Reputation]) 
) As pt 
+2

Dzięki Mikael !!!! – Dinesh

+1

Nie ma za co! –

+0

Byłem ciekawy dlaczego w pierwszym Select pt.People został użyty, ale pt. prefiks nie jest wymagany tutaj – Jowen

0

I odtworzył ten serwer SQL i to działa dobrze.

Próbuję przekonwertować to do pracy, gdy ktoś nie wie, jaka zawartość będzie w kolumnach TYP i OPIS.

Użyłem tego również jako przewodnika. (Convert Rows to columns using 'Pivot' in SQL Server)

EDIT ----

Oto moje rozwiązanie dla wyżej, gdzie nie znają treści w każdej dziedzinie ....

-- setup commands 
     drop table #mytemp 
     go 

     create table #mytemp (
      id varchar(10), 
      Metal_01 varchar(30), 
      Metal_02 varchar(100) 
     ) 


-- insert the data 
     insert into #mytemp 
     select 'C-0','Metal One','Metal_One' union all 
     select 'C-0','Metal & Two','Metal_Two' union all 
     select 'C-1','Metal One','Metal_One' union all 
     select 'C-1','Metal (Four)','Metal_Four' union all 
     select 'C-2','Metal (Four)','Metal_Four' union all 
     select 'C-2','Metal/Six','Metal_Six' union all 
     select 'C-3','Metal Seven','Metal_Seven' union all 
     select 'C-3','Metal Eight','Metal_Eight' 

-- prepare the data for rotating: 
     drop table #mytemp_ReadyForRotate 
     select *, 
        replace(
         replace(
          replace(
           replace(
            replace(
               mt.Metal_01,space(1),'_' 
              ) 
             ,'(','_' 
             ) 
            ,')','_' 
            ) 
           ,'/','_' 
           ) 
          ,'&','_' 
          ) 
        as Metal_No_Spaces 
     into #mytemp_ReadyForRotate 
     from #mytemp mt 

    select 'This is the content of "#mytemp_ReadyForRotate"' as mynote, * from #mytemp_ReadyForRotate 

-- this is for when you KNOW the content: 
-- in this query I am able to put the content that has the punctuation in the cell under the appropriate column header 

     Select id, pt.Metal_One, Metal_Two, Metal_Four, Metal_Six, Metal_Seven,Metal_Eight 
     FROM 
     (
      select * from #mytemp 
     ) As Temp 
     PIVOT 
     (
      max(Metal_01) 
      FOR Metal_02 In(
           Metal_One, 
           Metal_Two, 
           Metal_Four, 
           Metal_Six, 
           Metal_Seven, 
           Metal_Eight 
     ) 
     ) As pt 


-- this is for when you DON'T KNOW the content: 
-- in this query I am UNABLE to put the content that has the punctuation in the cell under the appropriate column header 
-- unknown as to why it gives me so much grief - just can't get it to work like the above 
-- it WORKS just fine but not with the punctuation field 
     drop table ##csr_Metals_Rotated 
     go 

     DECLARE @cols AS NVARCHAR(MAX), 
      @query AS NVARCHAR(MAX), 
      @InsertIntoTempTable as nvarchar(4000) 

     select @cols = STUFF((SELECT ',' + QUOTENAME(Metal_No_Spaces) 
          from #mytemp_ReadyForRotate 
          group by Metal_No_Spaces 
          order by Metal_No_Spaces 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 

     set @query = 'SELECT id,' + @cols + ' into ##csr_Metals_Rotated from 
        (
         select id as id, Metal_No_Spaces 
         from #mytemp_ReadyForRotate 
        ) x 
        pivot 
        (
         max(Metal_No_Spaces) 
         for Metal_No_Spaces in (' + @cols + ') 
        ) p ' 
     execute(@query); 

     select * from ##csr_Metals_Rotated 
+0

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej] (// meta.stackoverflow.com/q/8259) do włączenia istotnych części odpowiedz tutaj i podaj link do odniesienia. – GhostCat

+0

Muszę przeprosić - moja "odpowiedź" nie odpowiada na pytanie. - Po prostu potrzebowałem, aby opublikowana odpowiedź na to stanowisko była dynamiczna ... gdzie programista nie znał treści pól, ale serwer SQL mógł tworzyć pola w locie i wypełniać je. - Udało mi się to rozgryźć i opublikuję moje odkrycia tutaj za kilka dni - w czasach kryzysu. – user2792497