2017-07-15 3 views
1

Ich habe die folgende Abfrage:Verschwenkung Satzwerte auf Spaltennamen mit verknüpften Tabellen

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 

Eine Teilmenge der resultierenden Daten sieht etwa so aus:

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 

Ich versuche, das zu verschwenken Datensätze von PA_NAME, sodass ich einen einzelnen Datensatz für jeden eindeutigen LOT-Wert und Spalten für jeden in der WHERE-Klausel aufgelisteten PA_NAME plus SAMPLE_ID und PARAM_UNITS erhalte. So etwas wie folgt aus:

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 

habe ich versucht, mit der PIVOT-Operator herum spielen, aber kann nicht scheinen, um das Ergebnis zu erhalten, ich bin für mit ihm suchen. Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Scheint wie eine hübsche Standard-Pivot-Anweisung wird wollen Sie wollen.

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 

Als Neben Ihre LEFT JOIN beachten Sie in eine innere wird JOIN umgewandelt, da Sie genau wissen, wo Klausel einen Filter auf der „richtigen“ Seite s.METHOD_SUBCLASS = 'BATCH'

0

enthält können Sie wie unten abfragen:

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

Ausgabe wie folgt:

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

Für dynamische Liste von Spalten kann wie folgt abfragen:

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; 
Verwandte Themen