Subject | [firebird-support] Re: Full Cross Tab but unknown column headers |
---|---|
Author | Svein Erling Tysvær |
Post date | 2013-12-28T15:02:05Z |
Hi Bhavbhuti!
Let's split this into two parts.
Running
EXECUTE BLOCK returns (Mystatement varchar(4096)) AS
DECLARE VARIABLE S VARCHAR(256);
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE S2 VARCHAR(256);
DECLARE VARIABLE SIIF VARCHAR(1024);
DECLARE VARIABLE SJOIN VARCHAR(1024);
BEGIN
S='';
S2='';
SIIF='';
SJOIN='';
I=1;
FOR SELECT 'LEFT JOIN MACCOUNTS MA'||:I||' ON MA'||:I||'.CCODE = '''||CCODE||
''' AND MA'||:I||'.IID = r.IACCOUNTID ', 'SUM(IIF(MA'||:I||'.IID IS NOT NULL, r.BAMT, 0))'
FROM MACCOUNTS MA1
WHERE MA1.CCODE > ''
AND NOT EXISTS(SELECT * FROM MACCOUNTS MA2
WHERE MA1.CCODE = MA2.CCODE
AND MA1.IID > MA2.IID) INTO :S, S2 DO
BEGIN
SJOIN = SJOIN||S;
SIIF = SIIF||', '||S2;
I=I+1;
END
FOR WITH TMP(FIELD_NAMES) AS
(SELECT LIST(CCODE) FROM MACCOUNTS MA1
WHERE MA1.CCODE > ''
AND NOT EXISTS(SELECT * FROM MACCOUNTS MA2
WHERE MA1.CCODE = MA2.CCODE
AND MA1.IID > MA2.IID))
SELECT 'WITH TMP(IPID,'||FIELD_NAMES||') AS (SELECT r.IPID'||:SIIF||
'FROM SSALEINVOICEFOOTER r ' || :SJOIN||' GROUP BY 1) SELECT * FROM TMP'
FROM TMP INTO :MyStatement DO
SUSPEND;
END;
will return a statement that, when run, will return almost the result you want ('almost' being that it returns 0 and not NULL for columns not existing and that you may have to do some modifications if there may exist named rows in MACCOUNTS that doesn't exist in SSALEINVOICEFOOTER and hence, shouldn't be a column).
I still think this is far more complicated than doing such conversions using PivotTables in Excel or similar.
HTH,
Set
Let's split this into two parts.
Running
EXECUTE BLOCK returns (Mystatement varchar(4096)) AS
DECLARE VARIABLE S VARCHAR(256);
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE S2 VARCHAR(256);
DECLARE VARIABLE SIIF VARCHAR(1024);
DECLARE VARIABLE SJOIN VARCHAR(1024);
BEGIN
S='';
S2='';
SIIF='';
SJOIN='';
I=1;
FOR SELECT 'LEFT JOIN MACCOUNTS MA'||:I||' ON MA'||:I||'.CCODE = '''||CCODE||
''' AND MA'||:I||'.IID = r.IACCOUNTID ', 'SUM(IIF(MA'||:I||'.IID IS NOT NULL, r.BAMT, 0))'
FROM MACCOUNTS MA1
WHERE MA1.CCODE > ''
AND NOT EXISTS(SELECT * FROM MACCOUNTS MA2
WHERE MA1.CCODE = MA2.CCODE
AND MA1.IID > MA2.IID) INTO :S, S2 DO
BEGIN
SJOIN = SJOIN||S;
SIIF = SIIF||', '||S2;
I=I+1;
END
FOR WITH TMP(FIELD_NAMES) AS
(SELECT LIST(CCODE) FROM MACCOUNTS MA1
WHERE MA1.CCODE > ''
AND NOT EXISTS(SELECT * FROM MACCOUNTS MA2
WHERE MA1.CCODE = MA2.CCODE
AND MA1.IID > MA2.IID))
SELECT 'WITH TMP(IPID,'||FIELD_NAMES||') AS (SELECT r.IPID'||:SIIF||
'FROM SSALEINVOICEFOOTER r ' || :SJOIN||' GROUP BY 1) SELECT * FROM TMP'
FROM TMP INTO :MyStatement DO
SUSPEND;
END;
will return a statement that, when run, will return almost the result you want ('almost' being that it returns 0 and not NULL for columns not existing and that you may have to do some modifications if there may exist named rows in MACCOUNTS that doesn't exist in SSALEINVOICEFOOTER and hence, shouldn't be a column).
I still think this is far more complicated than doing such conversions using PivotTables in Excel or similar.
HTH,
Set