2017-11-29 5 views
0

Also versuche ich Zeilen in Spalten zu konvertieren. Dies hat vor auf dieser Seite in einer Vielzahl von verschiedenen Möglichkeiten abgedeckt, die Art und Weise Ich mag das Beste ist, wie folgt:Eine Tabelle in iSeries DB2 dynamisch schwenken

SELECT 
    FRNPCM032.WFP.WFORD#, 
    MAX(CASE WHEN FRNPCM032.WFP.WFSEGN = 'COLOR1' THEN WFVAL END) AS COLOR, 
    MAX(CASE WHEN FRNPCM032.WFP.WFSEGN = 'OSKVA' THEN WFVAL END) AS KVA, 
    MAX(CASE WHEN FRNPCM032.WFP.WFSEGN = 'OSSWITCH' THEN WFVAL END) AS LBSWITCH 
FROM FRNPCM032.WFP 
GROUP BY FRNPCM032.WFP.WFORD#; 

Dies ist eine sehr einfache Art und Weise ist, aber ich brauche etwas weniger manuelle als dies, weil neue Zeilen könnten später hinzugefügt werden und ich möchte nicht zurückgehen müssen, um eine Abfrage oder Ansicht aufrechtzuerhalten.

Gibt es eine Möglichkeit, das kann ich dynamisch tun? Ich kann mir einen Weg vorstellen, wie man das mit Loops macht, aber das kann ich in einer Abfrage oder Ansicht nicht tun.

+0

Es ist nicht wie IBM D2 scheint hat eine 'PIVOT' Methode wie andere RDBMS wie in [vorherigen Beiträgen] (https://stackoverflow.com/questions/15529107/pivoting-in-db2) gesehen. Erwägen Sie die Verwendung von Universalcode (Java, Python, C#, PHP, VB, Perl, R), um die Ergebnismenge neu zu gestalten. Alle diese können sich mit DB2 verbinden. SQL ist eine spezielle, deklarative Sprache, die wirklich für unveränderliches, Set-basiertes Retrieval und Manipulation, nicht für dynamisches Reporting entwickelt wurde. – Parfait

Antwort

0

Leider DB2 für IBM i keine PIVOT() Funktion ...

jedoch nicht haben, können Sie eine Prozedur erstellen, die auf den aktuellen Inhalt der Tabelle dynamisch aussieht und baut eine SQL-Anweisung, dass schwenkt die Daten.

Der folgende Code aus dem Artikel entnommen wurde, An SQL Pivot Procedure

Wenn Sie wollen Sie den Code ändern könnten eine Ansicht zu bauen, anstatt eine Ergebnismenge zurück. Aber Sie müssten die Ansicht neu erstellen, wenn sich die Pivotwerte ändern.

CREATE PROCEDURE DO_PIVOT 
    (IN FOR_SCHEMA CHARACTER (10) , 
    IN FOR_TABLE CHARACTER (10) , 
    IN PIVOT_COLUMN VARCHAR (250) , 
    IN VALUE_COLUMN VARCHAR (250) , 
    IN AGG_FUNCTION VARCHAR (5) DEFAULT 'SUM' , 
    IN GROUP_COLUMN VARCHAR (250) DEFAULT NULL) 
    LANGUAGE SQL 
    MODIFIES SQL DATA 
    PROGRAM TYPE SUB 
    CONCURRENT ACCESS RESOLUTION DEFAULT 
    DYNAMIC RESULT SETS 1 
    OLD SAVEPOINT LEVEL COMMIT ON RETURN NO 

BEGIN 

    DECLARE SQLCODE INTEGER DEFAULT 0 ; 
    DECLARE SQL_STATEMENT VARCHAR (5000) ; 
    DECLARE PIVOT_VALUE VARCHAR (20) ; 
    DECLARE PAD CHAR (2) DEFAULT ' ' ; 

    DECLARE C1 CURSOR FOR D1 ; 
    DECLARE C2 CURSOR WITH RETURN FOR D2 ; 

    SET SCHEMA = FOR_SCHEMA ; 

    -- Get the list of values available for the pivot column 
    -- Each value will be a column in the return set 
    SET SQL_STATEMENT = 'select distinct ' 
         || PIVOT_COLUMN 
         || ' from ' 
         || FOR_TABLE 
         || ' order by 1' ; 

    PREPARE D1 FROM SQL_STATEMENT ; 
    OPEN C1 ; 

    -- Construct a dynamic select statement for the pivot 
    SET SQL_STATEMENT = 'select ' ; 

    -- If requested, add the Group By Column 
    -- to the select clause 
    IF GROUP_COLUMN IS NOT NULL THEN 
     SET SQL_STATEMENT = SQL_STATEMENT || GROUP_COLUMN ; 
     SET PAD = ', ' ; 
    END IF ; 

    -- For each possible value for the Pivot Column, 
    -- add a case statement to perform the requested 
    -- aggregate function on the Value Column 
    FETCH NEXT FROM C1 INTO PIVOT_VALUE ; 
    WHILE (SQLCODE >= 0 AND SQLCODE <> 100) DO 
     SET SQL_STATEMENT = SQL_STATEMENT 
          || PAD 
          || AGG_FUNCTION 
          || '(CASE WHEN ' 
          || PIVOT_COLUMN 
          || ' = ''' 
          || PIVOT_VALUE 
          || ''' THEN ' 
          || VALUE_COLUMN 
          || ' END) AS ' 
          || PIVOT_VALUE ; 
     SET PAD = ', ' ; 
     FETCH NEXT FROM C1 INTO PIVOT_VALUE ; 
    END WHILE ; 
    CLOSE C1 ; 

    -- Specify the table to select from 
    SET SQL_STATEMENT = SQL_STATEMENT 
         || ' from ' 
         || FOR_TABLE ; 

    -- If requested, add the Group By Column 
    -- to the select clause 
    IF GROUP_COLUMN IS NOT NULL THEN 
     SET SQL_STATEMENT = SQL_STATEMENT 
          || ' group by ' 
          || GROUP_COLUMN 
          || ' order by ' 
          || GROUP_COLUMN; 
    END IF ; 

    PREPARE D2 FROM SQL_STATEMENT ; 
    OPEN C2 ; 

END ; 

LABEL ON ROUTINE DO_PIVOT 
    (CHAR(), CHAR(), VARCHAR(), VARCHAR(), VARCHAR(), VARCHAR()) 
    IS 'Perform a General Purpose Pivot'; 

COMMENT ON PARAMETER ROUTINE DO_PIVOT 
    (CHAR(), CHAR(), VARCHAR(), VARCHAR(), VARCHAR(), VARCHAR()) 
    (FOR_SCHEMA IS 'Schema for Table' , 
    FOR_TABLE IS 'For Table' , 
    PIVOT_COLUMN IS 'Name of Column to be Pivoted' , 
    VALUE_COLUMN IS 'Column to be Aggregated for Pivot' , 
    AGG_FUNCTION IS 'Use Aggregate Function' , 
    GROUP_COLUMN IS 'Group on Column') ; 
+0

So nah wie ich weiß, erlaubt keine Implementierung von 'PIVOT' dynamische Spalten, also müssten Sie dies überall tun. –

Verwandte Themen