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

将UNION查询转为CTE后,如何选取R.SoldDate并实现CASE逻辑?

解决CTE中无法访问SoldDate字段并生成[CHECKING PIF DATE]的问题

问题出在你原来的UNION查询结构上——UNION是按列的位置而非列名来合并结果的。你的第一个查询返回Account和PaidOffDate,第二个返回Account和SoldDate,这意味着合并后的结果集里,第二列会混合两种日期值,但并没有单独的SoldDate字段供后续CTE使用。

要解决这个问题,你需要让UNION的两个分支都返回相同的列集合,缺失的字段用NULL填充,这样CTE里就能同时包含PaidOffDate和SoldDate两个字段了。

下面是调整后的完整代码:

WITH Inactives AS (
    -- 第一个分支:非REO的已结清贷款
    SELECT 
        L.Account,
        L.PaidOffDate,
        CAST(NULL AS DATE) AS SoldDate  -- 显式添加SoldDate字段,用NULL填充
    FROM MARS.dbo.vw_Loans L 
    WHERE 
        L.isActive = 'False' 
        AND L.LoanStatus NOT LIKE '%REO%' 
        AND L.LoanStatus <> 'Trailing Claims'

    UNION 

    -- 第二个分支:已售出的REO对应的贷款
    SELECT 
        L.Account,
        CAST(NULL AS DATE) AS PaidOffDate,  -- 显式添加PaidOffDate字段,用NULL填充
        R.SoldDate
    FROM MARS.dbo.vw_REO R 
    LEFT JOIN MARS.dbo.vw_Loans L ON L.ConvertedToPropertyID = R.PropertyID 
    WHERE 
        R.Active = 0 
        AND R.Status = 'Sold' 
        AND L.isActive = 'False' 
        AND L.LoanStatus LIKE '%REO%'
)
SELECT 
    Account,
    CASE 
        WHEN PaidOffDate IS NOT NULL 
             AND PaidOffDate BETWEEN DATEADD(MONTH, DATEDIFF(MONTH, 0, @reportingDate), -1) AND @reportingDate 
             THEN PaidOffDate 
        WHEN SoldDate IS NOT NULL 
             AND SoldDate BETWEEN DATEADD(MONTH, DATEDIFF(MONTH, 0, @reportingDate), -1) AND @reportingDate 
             THEN SoldDate 
        ELSE NULL  -- 建议用NULL而非空字符串,避免日期类型与字符串类型的不匹配问题
    END AS [CHECKING PIF DATE]
FROM Inactives;

关键说明:

  1. 统一列结构:在UNION的两个分支中都显式声明PaidOffDate和SoldDate,用CAST(NULL AS DATE)确保字段类型一致,避免隐式转换引发的错误。
  2. 简化CASE逻辑:把嵌套的CASE WHEN合并成单层结构,代码可读性更强。
  3. 保持类型一致性:原代码中ELSE ''会将日期类型强制转为字符串,改为ELSE NULL可以维持字段的日期类型,方便后续的数据处理。

内容的提问来源于stack exchange,提问作者Wolfy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:51:33