将两个SQL查询合并:为主查询添加交易状态附属列
合并SQL查询,添加交易状态列
这里有两种实用的方式来把你的交易状态查询整合到主企业信息查询中,新增Trs4m列展示每个企业的交易状态:
方法1:LEFT JOIN 预处理后的子查询
这种方法最直观,先把交易状态查询处理成每个企业对应唯一状态值,再通过firm_global_id和主查询关联。因为原交易查询可能会为同一个企业返回多条记录(比如同时存在近4个月和超过4个月的交易),我们用MAX()聚合来确保只要有近4个月的交易,状态就显示1,否则显示0。
完整SQL代码:
SELECT dim.firm_sys_no "firm_sys_no", dim.firm_global_id "Firm Global ID", COALESCE(trans_status.Trs4m, 0) "Trs4m" -- 没有交易记录的企业默认设为0 FROM FIRM_DETAILS_DIM dim LEFT OUTER JOIN ACTIVITIES_FACT act ON dim.FIRM_SYS_NO = act.FIRM_SYS_NO LEFT OUTER JOIN REPORTING_SALES_ORG_DIM org ON org.ORG_SYS_NO = act.SALES_ORG_SYS_NO INNER JOIN ( SELECT * FROM REPORTING_SALES_ORG_DIM WHERE EFFECTIVE_END_DATE IS NULL ) SALES_ORG_LATEST ON org.SALES_OFFICE_ID = SALES_ORG_LATEST.SALES_OFFICE_ID LEFT JOIN ( -- 预处理子查询:获取每个企业的最终交易状态 SELECT fd.firm_global_id, MAX(CASE WHEN ROUND(MONTHS_BETWEEN(CURRENT_DATE, st.transaction_date), 0) > 4 THEN 0 ELSE 1 END) "Trs4m" FROM SLS_MONTHLY_TRANS_F st INNER JOIN firm_details_dim fd ON fd.firm_sys_no = st.firm_sys_no WHERE st.transaction_amount_usd <> 0 GROUP BY fd.firm_global_id ) trans_status ON dim.firm_global_id = trans_status.firm_global_id WHERE act.EFFECTIVE_END_DATE IS NULL AND dim.FIRM_GLOBAL_ID <> '-1' AND SALES_ORG_LATEST.GLOBAL_REGION_NAME IS NOT Null GROUP BY dim.firm_sys_no, dim.firm_global_id, trans_status.Trs4m ORDER BY dim.firm_global_id, dim.firm_sys_no
方法2:SELECT列表中的标量子查询
如果你的数据库支持标量子查询(大多数主流数据库都支持),可以直接在SELECT里嵌入子查询,这种写法更紧凑。同样需要确保子查询每个企业只返回一个值:
完整SQL代码:
SELECT dim.firm_sys_no "firm_sys_no", dim.firm_global_id "Firm Global ID", -- 标量子查询获取交易状态,无交易则返回0 ( SELECT MAX(CASE WHEN ROUND(MONTHS_BETWEEN(CURRENT_DATE, st.transaction_date), 0) > 4 THEN 0 ELSE 1 END) FROM SLS_MONTHLY_TRANS_F st WHERE st.firm_sys_no = dim.firm_sys_no AND st.transaction_amount_usd <> 0 ) "Trs4m" FROM FIRM_DETAILS_DIM dim LEFT OUTER JOIN ACTIVITIES_FACT act ON dim.FIRM_SYS_NO = act.FIRM_SYS_NO LEFT OUTER JOIN REPORTING_SALES_ORG_DIM org ON org.ORG_SYS_NO = act.SALES_ORG_SYS_NO INNER JOIN ( SELECT * FROM REPORTING_SALES_ORG_DIM WHERE EFFECTIVE_END_DATE IS NULL ) SALES_ORG_LATEST ON org.SALES_OFFICE_ID = SALES_ORG_LATEST.SALES_OFFICE_ID WHERE act.EFFECTIVE_END_DATE IS NULL AND dim.FIRM_GLOBAL_ID <> '-1' AND SALES_ORG_LATEST.GLOBAL_REGION_NAME IS NOT Null GROUP BY dim.firm_sys_no, dim.firm_global_id ORDER BY dim.firm_global_id, dim.firm_sys_no
关键说明:
- 我用
MAX()聚合交易状态是因为如果一个企业同时存在近4个月和超过4个月的交易,我们更关注是否有近期交易(所以取1),如果你的需求是要统计不同状态的数量,那可以调整聚合方式或者不聚合,但那样主查询会返回多条对应不同状态的记录。 - 用
COALESCE()或者子查询默认返回0是为了处理那些没有任何交易记录的企业,避免结果中出现NULL。
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

