行值作为列

时间:2017-06-07 13:02:11

标签: sql sql-server sql-server-2008

我有以下记录

DocNo   PrnOrd  DESCR   ITEMCD  AMT
1          1    D1      16844   43330
1          2    D2      16844   
1          7    D7      16844   2166.5
1         21    D21     16844   0.5
1          1    D1        937   58188
1          7    D7        937   2909.4
1         21    D21       937   
1         23    D23       937   -0.02

想要像这样出现

DocNo,ITEMCD,   D1,    D2,     D7, D21,  D23,
1    , 16844,43330,      , 2166.5, 0.5,     ,
1    ,   937,58188,2909.4,       ,    ,-0.02,

DESCR字段值作为列,其AMT作为值

2 个答案:

答案 0 :(得分:0)

尝试如下:

 DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.DESCR) 
                FROM temp c
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')

    set @query = 'SELECT DocNo   ,ITEMCD, ' + @cols + ' from 
                (
                    select DocNo ,ITEMCD  
                        , AMT
                        , DESCR
                    from temp
               ) x
                pivot 
                (
                     max(AMT)
                    for DESCR in (' + @cols + ')
                ) p '

exec (@query)

输出:

*-*-------*-------*-------*----*----------*----------*     
|1| 937   |58188    |NULL |    |-0.02     |2909.4    |     
*-*-------*-------*-------*----*----------*----------*     
|1| 16844   |43330  |     |0.5 |    NULL  |2166.5    |      
*-*-------*-------*-------*----*----------*----------*     

答案 1 :(得分:0)

Pivot是您最好的选择。没有更多细节,很难完全回答;表名等。