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

Reply via email to