I'm sorry to post this complex SQL statement - I'm trying to simplify it.
I would like to avoid having to recode the CASE expression for the GROUP BY and ORDER BY. The above example is a simple query - I have a more complex one. Also, I require second CASE expression that depends on the conditions in the first one.
I thought this might do the trick, but I'm stuck on the ON clause:
The error I get is:
This makes sense, but I don't know how to code the correct ON clause.
Thank you for any suggestions you may have.
Francis.
Code:
SELECT
CASE
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2192', 'D3155', 'D3211', 'D3212', 'D3213', 'D3214',
'D3215', 'D3216', 'D3217', 'D3218', 'D3220', 'D3222',
'D3325', 'D3334', 'D3335', 'D3337', 'D3338', 'D3424',
'D3425', 'D3488', 'D3600', 'D3739', 'D3744', 'D3745',
'D3793', 'D3795', 'D3796')
THEN 'Private Banking'
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2000', 'D3240')
THEN 'Direct Banking'
WHEN
((SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD = 'D3553') OR
(SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '3553%') OR
((SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355354%' OR
SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355355%') AND
SYS1.S1_REPTG_RESP_F.DIVISION_NODE = 'U7001')) AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355357%' AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355358%' AND
(SYS1.S1_CL_MG_ACT_D.REFRL_ID IS NULL OR
(NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'S%' AND
(NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'I%')))
THEN 'Broker Direct'
ELSE 'Total Bank Excl. BD, DB, PB'
END AS BUS_CHANNEL,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE_NM,
SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD,
SYS1.S1_REPTG_RESP_F.NODE_NM,
COUNT(SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO)
FROM
SYS1.S1_CL_MG_ACT_D,
SYS1.S1_REPTG_RESP_F,
SYS1.S1_CL_MG_ACT_F
WHERE
(SYS1.S1_REPTG_RESP_F.RESP_NODE_ID = SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_ID) AND
(SYS1.S1_CL_MG_ACT_F.SP_ACT_KEY = SYS1.S1_CL_MG_ACT_D.SP_ACT_KEY) AND
(SYS1.S1_CL_MG_ACT_F.TIME_DIM_KEY = 37550) AND
(SYS1.S1_CL_MG_ACT_D.ACT_PRFL_END_DT >= '2010-01-31') AND
(SYS1.S1_CL_MG_ACT_D.ACT_PRFL_START_DT <= '2010-01-01') AND
(SYS1.S1_REPTG_RESP_F.TIME_DIM_KEY = 37550) AND
(SYS1.S1_CL_MG_ACT_F.LN_STAT_CD = 'A') AND
(SYS1.S1_CL_MG_ACT_D.NO_DWELLING_UNIT <= 6) AND
(SYS1.S1_CL_MG_ACT_D.MG_SECUR_TYP_CD <> '3') AND
(SYS1.S1_CL_MG_ACT_D.MG_PROP_TYPE_CD = '1') AND
(SYS1.S1_CL_MG_ACT_D.INVS_REF_NO NOT IN (70001, 70002)) AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355356%' AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355359%'
GROUP BY
CASE
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2192', 'D3155', 'D3211', 'D3212', 'D3213', 'D3214',
'D3215', 'D3216', 'D3217', 'D3218', 'D3220', 'D3222',
'D3325', 'D3334', 'D3335', 'D3337', 'D3338', 'D3424',
'D3425', 'D3488', 'D3600', 'D3739', 'D3744', 'D3745',
'D3793', 'D3795', 'D3796')
THEN 'Private Banking'
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2000', 'D3240')
THEN 'Direct Banking'
WHEN
((SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD = 'D3553') OR
(SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '3553%') OR
((SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355354%' OR
SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355355%') AND
SYS1.S1_REPTG_RESP_F.DIVISION_NODE = 'U7001')) AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355357%' AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355358%' AND
(SYS1.S1_CL_MG_ACT_D.REFRL_ID IS NULL OR
(NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'S%' AND
(NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'I%')))
THEN 'Broker Direct'
ELSE 'Total Bank Excl. BD, DB, PB'
END,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE_NM,
SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD,
SYS1.S1_REPTG_RESP_F.NODE_NM
ORDER BY
CASE
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2192', 'D3155', 'D3211', 'D3212', 'D3213', 'D3214',
'D3215', 'D3216', 'D3217', 'D3218', 'D3220', 'D3222',
'D3325', 'D3334', 'D3335', 'D3337', 'D3338', 'D3424',
'D3425', 'D3488', 'D3600', 'D3739', 'D3744', 'D3745',
'D3793', 'D3795', 'D3796')
THEN 'Private Banking'
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2000', 'D3240')
THEN 'Direct Banking'
WHEN
((OWN_RESP_NODE_CD = 'D3553') OR
(SRC_SYS_ACT_NO LIKE '3553%') OR
((SRC_SYS_ACT_NO LIKE '355354%' OR SRC_SYS_ACT_NO LIKE '355355%') AND DIVISION_NODE = 'U7001'))
AND NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355357%'
AND NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355358%'
AND (SYS1.S1_CL_MG_ACT_D.REFRL_ID IS NULL OR (NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'S%' AND NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'I%'))
THEN 'Broker Direct'
ELSE 'Total Bank Excl. BD, DB, PB'
END,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE_NM,
SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD,
SYS1.S1_REPTG_RESP_F.NODE_NM
I thought this might do the trick, but I'm stuck on the ON clause:
Code:
SELECT
D2.BUS_CHANNEL.
D2.DIVISION_NODE,
D2.DIVISION_NODE_NM,
D2.OWN_RESP_NODE_CD,
D2.S1_REPTG_RESP_F.NODE_NM,
COUNT(D2.SRC_SYS_ACT_NO)
FROM
SYS1.S1_CL_MG_ACT_D D1,
SYS1.S1_REPTG_RESP_F,
SYS1.S1_CL_MG_ACT_F
JOIN
(
SELECT
CASE
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2192', 'D3155', 'D3211', 'D3212', 'D3213', 'D3214',
'D3215', 'D3216', 'D3217', 'D3218', 'D3220', 'D3222',
'D3325', 'D3334', 'D3335', 'D3337', 'D3338', 'D3424',
'D3425', 'D3488', 'D3600', 'D3739', 'D3744', 'D3745',
'D3793', 'D3795', 'D3796')
THEN 'Private Banking'
WHEN SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD IN
('D2000', 'D3240')
THEN 'Direct Banking'
WHEN
((SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD = 'D3553') OR
(SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '3553%') OR
((SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355354%' OR
SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355355%') AND
SYS1.S1_REPTG_RESP_F.DIVISION_NODE = 'U7001')) AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355357%' AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355358%' AND
(SYS1.S1_CL_MG_ACT_D.REFRL_ID IS NULL OR
(NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'S%' AND
(NOT SYS1.S1_CL_MG_ACT_D.REFRL_ID LIKE 'I%')))
THEN 'Broker Direct'
ELSE 'Total Bank Excl. BD, DB, PB'
END AS BUS_CHANNEL,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE_NM,
SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD,
SYS1.S1_REPTG_RESP_F.NODE_NM,
SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO
FROM
SYS1.S1_CL_MG_ACT_D,
SYS1.S1_REPTG_RESP_F,
SYS1.S1_CL_MG_ACT_F
WHERE
(SYS1.S1_REPTG_RESP_F.RESP_NODE_ID = SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_ID) AND
(SYS1.S1_CL_MG_ACT_F.SP_ACT_KEY = SYS1.S1_CL_MG_ACT_D.SP_ACT_KEY) AND
(SYS1.S1_CL_MG_ACT_F.TIME_DIM_KEY = 37550) AND
(SYS1.S1_CL_MG_ACT_D.ACT_PRFL_END_DT >= '2010-01-31') AND
(SYS1.S1_CL_MG_ACT_D.ACT_PRFL_START_DT <= '2010-01-01') AND
(SYS1.S1_REPTG_RESP_F.TIME_DIM_KEY = 37550) AND
(SYS1.S1_CL_MG_ACT_F.LN_STAT_CD = 'A') AND
(SYS1.S1_CL_MG_ACT_D.NO_DWELLING_UNIT <= 6) AND
(SYS1.S1_CL_MG_ACT_D.MG_SECUR_TYP_CD <> '3') AND
(SYS1.S1_CL_MG_ACT_D.MG_PROP_TYPE_CD = '1') AND
(SYS1.S1_CL_MG_ACT_D.INVS_REF_NO NOT IN (70001, 70002)) AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355356%' AND
NOT SYS1.S1_CL_MG_ACT_D.SRC_SYS_ACT_NO LIKE '355359%'
) D2
ON D1.SRC_SYS_ACT_NO = D2.SRC_SYS_ACT_NO
GROUP BY
D2.BUS_CHANNEL,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE_NM,
SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD,
SYS1.S1_REPTG_RESP_F.NODE_NM
ORDER BY
D2.BUS_CHANNEL,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE,
SYS1.S1_REPTG_RESP_F.DIVISION_NODE_NM,
SYS1.S1_CL_MG_ACT_D.OWN_RESP_NODE_CD,
SYS1.S1_REPTG_RESP_F.NODE_NM
42972(-338)[IBM][CLI Driver][DB2/AIX64] SQL0338N An ON clause associated with a JOIN operator or in a MERGE statement is not valid. SQLSTATE=42972
Thank you for any suggestions you may have.
Francis.
Comment