2016-06-02 13 views
0

Ich habe eine Tabelle mit 3 Spalten, in denen die erste die ID ist und die beiden anderen Daten auf den Wert in der ersten Spalte verknüpft wie folgt enthält:Wie kann ich die Werte in einer Spalte in SQL in neue Spaltennamen PIVOT und dann andere Spaltenwerte unter diesen PIVOT-Spalten auflisten?

ID | CutOff | Value 
------------------------------------- 
01 | 2016-03-31 | AA 
01 | 2016-04-30 | AB 
01 | 2016-05-31 | AC 
02 | 2016-03-31 | BA 
02 | 2016-04-30 | BB 
02 | 2016-05-31 | BC 
03 | 2016-03-31 | FA 
03 | 2016-04-30 | FB 
03 | 2016-05-31 | FC 

I der ersten Spalte unterschiedliche Werte in Spalte zu verschwenken braucht Namen, aber pflegen Sie die Informationen in den zwei anderen Spalten (CutOff und Value) unter der entsprechenden PIVOTed-Spalte. Die CutOff Daten sind die gleichen für alle IDs, aber die Werte in der Spalte Wert sind zu jeder ID einzigartig, und hier ist das gewünschte Ergebnis:

CutOff  | 01 | 02 | 03 | 
--------------------- 
2016-03-31 | AA | BA | FA 
2016-04-30 | AB | BB | FB 
2016-05-31 | AC | BC | FC 

ich gegoogelt habe und surften Stackstundenlang, ohne dass es immer, jemand Wer könnte freundlich helfen?

+3

Tag der dbms verwendet, die Antwort kann produktspezifisch sein! – jarlh

+0

sind die ID-Variablen .. dh 04, 05 .. in diesem Fall ist es nicht sehr gute Idee, Tabellenstruktur auf diese Weise zu machen .. wenn es fest ist und wird nie ändern Sie können Gruppe von Anweisung usw. verwenden. – nayana

+0

Die IDs sind in der Tat variabel, und Sie haben wahrscheinlich recht, es ist nicht die beste Art, eine Tabelle zu strukturieren. – Amon

Antwort

0

Sie können diese mithilfe der bedingten Aggregation tun:

select cutoff, 
     max(case when id = '01' then value end) as id_01, 
     max(case when id = '02' then value end) as id_02, 
     max(case when id = '03' then value end) as id_03 
from t 
group by cutoff 
order by cutoff; 

Dies ist ANSI-Standardsyntax und von jeder Datenbank unterstützt.

0

Wenn ID s begrenzt werden Sie dies mit bedingten Aggregationen versuchen:

select CutOff, 
     max(case when od = '01' then Value end) as [01], 
     max(case when od = '02' then Value end) as [02], 
     max(case when od = '03' then Value end) as [03] 
from tablename 
group by CutOff 

Für SQL Server können Sie native verwenden PIVOT Anweisung:

select CutOff, [01], [02], [03] 
from tablename 
pivot(max(value) for id in([01], [02], [03])) p 
0

Danke für Ihre Hilfe, fand ich endlich einen Weg das funktioniert in einem ähnlichen Thread auf SE:

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

    SELECT @cols = STUFF((SELECT distinct ',' + 
          QUOTENAME(ID) 
          FROM MyTable 
          WHERE SomeWhereClause 
          FOR XML PATH(''), TYPE 
         ).value('.', 'NVARCHAR(MAX)') 
          , 1, 1, ''); 

    SELECT @query = 

    'SELECT * 
    FROM 
    (
     SELECT 
     o.CutOff, 
     p.ID, 
     o.Value 
     FROM MyTable AS o 
     INNER JOIN OtherTableWithID AS p ON o.ID = p.ID 
    ) AS t 
    PIVOT 
    (
     MAX(Value) 
     FOR Value IN(' + @cols + ')' + 
    ') AS p ; '; 

    execute(@query); 
+0

brauchen Sie nicht MAX (Wert) für ID IN ('+ @cols +') '' – JamieD77