You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:17:51