Sql Server透视记录中的多个列

时间:2017-02-14 15:29:03

标签: sql-server

我正在使用Sql Server 2014.我目前有一个看起来像这样的表:

labNumber   parameter   result  date
18897       Nitrate     <0      1/20/2007
18897       Coliform    NEG     1/21/2007
18897       Arsenic     1       1/22/2007

我需要创建一个视图,其中只有一条记录如下:

labNumber   nitate  nitrateDate  coliform   coliformDate    arsenic   arsenicDate
18897       <0      1/20/2007    NEG        1/21/2007       1         1/22/2007

在我意识到每个具有相同实验室编号的记录有不同的日期后,我使用PIVOT查看了这样的内容:

  SELECT *
  FROM  (SELECT  labNumber, result, parameter 
         FROM ResultsTable) src 
         PIVOT (MAX(result) 
         FOR parameter IN ([Nitrate], [Coliform], [Arsenic])) p

我完全不知道如何完成我想要的结果。

1 个答案:

答案 0 :(得分:2)

考虑到您只有parameter的记录,这是使用conditional aggregate

的一种方法
SELECT labNumber,
       Max(CASE WHEN parameter = 'Nitrate' THEN result END) AS nitate,
       Max(CASE WHEN parameter = 'Nitrate' THEN date END) nitateDate,
       Max(CASE WHEN parameter = 'Coliform' THEN result END) Coliform,
       Max(CASE WHEN parameter = 'Coliform' THEN date END) ColiformDate,
       Max(CASE WHEN parameter = 'Arsenic' THEN result END) Arsenic,
       Max(CASE WHEN parameter = 'Arsenic' THEN date END) ArsenicDate
FROM   yourtable
GROUP  BY labNumber 

unpivotingpivoting数据的另一种方法

SELECT labNumber,
       Nitrate,
       NitrateDate,
       Coliform,
       ColiformDate,
       Arsenic,
       ArsenicDate
FROM  (SELECT labNumber,
              intr,
              col
       FROM   Yourtable
              CROSS apply (VALUES (result,parameter),
                                  (convert(varchar(20),[date],120),parameter + 'Date')) cs(intr, col))a
      PIVOT (Max(intr)
            FOR col IN (Nitrate,
                        NitrateDate,
                        Coliform,
                        ColiformDate,
                        Arsenic,
                        ArsenicDate))pv