How to pivot text columns in SQL Server?

前端 未结 2 1934
日久生厌
日久生厌 2020-11-30 10:59

I have a table like this in my database (SQL Server 2008)

ID      Type            Desc
--------------------------------
C-0 Assets          No damage
C-0 Env         


        
相关标签:
2条回答
  • 2020-11-30 11:25
    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
    
    0 讨论(0)
  • 2020-11-30 11:36

    I recreated this in sql server and it works just fine.

    I'm trying to convert this to work when one does not know what the content will be in the TYPE and DESCRIPTION columns.

    I was also using this as a guide. (Convert Rows to columns using 'Pivot' in SQL Server)

    EDIT ----

    Here is my solution for the above where you DON'T KNOW the content in either field....

    -- 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 讨论(0)
提交回复
热议问题