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