2017-11-29 16 views
0

그래서 행을 컬럼으로 변환하려고합니다. 이것은, 방법의 진실성에이 사이트에 전에 다음과 같이 최선가 원하는 방식으로 덮여있다 :iSeries DB2에서 테이블을 동적으로 피킹

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#; 

이것은 매우 간단한 방법입니다,하지만 난 이것보다 뭔가 더 적은 매뉴얼을 필요로하기 때문에 새로운 행이 수도 나중에 추가 될 것이고 나는 쿼리 나 뷰를 유지하기 위해 돌아 가야하고 싶다.

동적으로 수행 할 수있는 방법이 있습니까? 루프를 사용하여 수행하는 방법을 생각할 수 있지만 쿼리 또는 뷰에서 수행 할 수 없습니다.

+0

는 [이전 글]에서 볼 수 있듯이 다른 RDBMS 년대와 같은'PIVOT' 방법 (https://stackoverflow.com/questions/15529107/pivoting-in-db2)가 있습니다. 결과 집합을 변경하기 위해 범용 코드 (Java, Python, C#, PHP, VB, Perl, R)를 사용하는 것이 좋습니다. 이 모든 것이 DB2에 연결할 수 있습니다. SQL은 동적보고가 아닌 변경 불가능한 세트 기반 검색 및 조작을 위해 실제로 설계된 특수 목적의 선언적 언어입니다. – Parfait

답변

0

불행하게도, 나는 PIVOT() 함수가없는 IBM 용 DB2 ... 그러나

, 동적 테이블의 현재 내용을 살펴보고 SQL 문 피벗 그 빌드 절차를 구축 할 수 있습니다 자료. 다음 코드는 기사에서 찍은

, An SQL Pivot Procedure

당신은 당신이 아니라 결과 집합을 반환하는 것보다보기를 구축하기 위해 코드를 수정할 수 있습니다 원한다면. 하지만 피벗 값이 변경되면보기를 다시 작성해야합니다. 그것은 IBM D2 아닌 것 같아

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

필자가 알고있는 바로는,'PIVOT '을 구현 한 사람은 동적 열을 허용하지 않으므로 어디서나이 작업을 수행해야합니다. –