web-dev-qa-db-fra.com

Comment faire pivoter les colonnes de texte dans SQL Server?

J'ai une table comme celle-ci dans ma base de données (SQL Server 2008)

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

je dois afficher les actifs, les personnes, l'environnement et la réputation sous forme de colonnes et afficher Desc correspondant en tant que valeurs. Mais lorsque j'exécute la requête pivot, toutes mes valeurs sont nulles.

Quelqu'un peut-il examiner ma requête et me dire où je me trompe?

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

Voici ma sortie

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
21
Dinesh
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
30
Mikael Eriksson

J'ai recréé ceci dans le serveur sql et cela fonctionne très bien.

J'essaye de convertir ceci pour fonctionner quand on ne sait pas quel sera le contenu dans les colonnes TYPE et DESCRIPTION.

J'utilisais également cela comme guide. ( Convertir des lignes en colonnes en utilisant 'Pivot' dans SQL Server )

ÉDITER ----

Voici ma solution pour ce qui précède où vous NE CONNAISSEZ PAS le contenu dans l'un ou l'autre domaine ....

-- 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
user2792497