2017-07-15 16 views
1

我有以下查詢:樞轉紀錄值一列名與連接表

SELECT 
    sp.SAMPLE_ID, 
    sp.PA_NAME, 
    sp.NRESULT, 
    sp.PARAM_UNITS, 
    s.LOT 
FROM 
    DANM..SAMPLEPARAM AS sp 
    LEFT JOIN DANM..SAMPLE AS s 
     ON sp.SAMPLE_ID = s.SAMPLE_ID 
WHERE 
    s.METHOD_SUBCLASS = 'BATCH' 
    AND sp.PA_NAME IN ('AL_V','CA_V','CO_V') 
    AND sp.ENTERED_ON > DATEADD(MONTH,-12,GETDATE()) 
ORDER BY 
    s.LOT, sp.PA_NAME 

所產生的數據的一個子集看起來是這樣的:

SAMPLE_ID | PA_NAME | NRESULT | PARAM_UNITS | LOT 
010001459826 | AL_V | 1.70000000 | PPB   | U6X599 
010001459826 | CA_V | 1.40000000 | PPB   | U6X599 
010001459826 | CO_V | 0.70000000 | PPB   | U6X599 
010001459828 | AL_V | 2.40000000 | PPB   | U6X600 
010001459828 | CA_V | 1.60000000 | PPB   | U6X600 
010001459828 | CO_V | 0.70000000 | PPB   | U6X600 

我試圖在轉動來自PA_NAME的記錄,這樣我就WHERE子句中列出的每個PA_NAME的每個唯一LOT值和列以及SAMPLE_ID和PARAM_UNITS獲得一條記錄。所以這樣的事情:

LOT | AL_V  | CA_V  | CO_V  | PARAM_UNITS | SAMPLE_ID 
U6X599 | 1.70000000 | 1.40000000 | 0.70000000 | PPB   | 010001459826 
U6X600 | 2.40000000 | 1.60000000 | 0.70000000 | PPB   | 010001459828 

我試着玩弄了PIVOT運營商,但似乎無法得到我期待的結果。任何幫助將不勝感激。

回答

0

看起來像一個漂亮的標準樞軸聲明會做你想要的。

SELECT 
    LOT , 
    AL_V , 
    CA_V , 
    CO_V , 
    PARAM_UNITS , 
    SAMPLE_ID 
FROM (
    SELECT 
     sp.SAMPLE_ID, 
     sp.PA_NAME, 
     sp.NRESULT, 
     sp.PARAM_UNITS, 
     s.LOT 
    FROM 
     DANM..SAMPLEPARAM AS sp 
     LEFT JOIN DANM..SAMPLE AS s 
      ON sp.SAMPLE_ID = s.SAMPLE_ID 
    WHERE 
     s.METHOD_SUBCLASS = 'BATCH' 
     AND sp.PA_NAME IN ('AL_V','CA_V','CO_V') 
     AND sp.ENTERED_ON > DATEADD(MONTH,-12,GETDATE())) p 
    PIVOT (max (NRESULT) FOR 
     PA_NAME IN ( 
     [AL_V], [CA_V], [CO_V])) AS pvt 
ORDER BY 
    LOT 

作爲一個側面說明你的LEFT JOIN被轉換爲INNER JOIN,因爲你的where子句包含了「右」側濾波器s.METHOD_SUBCLASS = 'BATCH'

0

可以如下查詢:

Select * from #Sample 
pivot (max(NResult) for PA_Name in ([AL_V],[CA_V],[CO_V])) p 

輸出如下:

+--------------+-------------+--------+------+------+------+ 
| Sample_id | Param_units | LOT | AL_V | CA_V | CO_V | 
+--------------+-------------+--------+------+------+------+ 
| 010001459826 | PPB   | U6X599 | 1.7 | 1.4 | 0.7 | 
| 010001459828 | PPB   | U6X600 | 2.4 | 1.6 | 0.7 | 
+--------------+-------------+--------+------+------+------+ 

對於列的動態列表您可以查詢如下:

Declare @cols1 varchar(max) 
Declare @query nvarchar(max) 

Select @cols1 = stuff((select Distinct ','+QuoteName(PA_Name) from #Sample for xml path('')),1,1,'') 
Select @query = ' Select * from 
       (Select Sample_id, PA_Name, NResult, Param_units, LOT from #Sample) a 
       pivot (max(NResult) for PA_Name in (' + @cols1 + ')) p ' 

Exec sp_executesql @query 
0
;With Pivotdata 
As 
(
    SELECT sp.SAMPLE_ID 
     ,sp.PA_NAME -- spreading element 
     ,sp.NRESULT -- aggregating element 
     ,sp.PARAM_UNITS 
     ,s.LOT -- grouping element 
    FROM DANM..SAMPLEPARAM AS sp 
    LEFT JOIN DANM..SAMPLE AS s ON sp.SAMPLE_ID = s.SAMPLE_ID 
    WHERE s.METHOD_SUBCLASS = 'BATCH' 
     AND sp.PA_NAME IN (
      'AL_V' 
      ,'CA_V' 
      ,'CO_V' 
      ) 
     AND sp.ENTERED_ON > DATEADD(MONTH, - 12, GETDATE()) 
) 
Select 
    Lot, AL_V, CA_V, CO_V, Param_Units, Sample_ID 
From Pivotdata 
Pivot(Sum(NResult) For PA_Name In (AL_V, CA_V, CO_V)) As P;