SQL - CASE语句如果记录为NULL,因为表中不存在记录

Nax*_*xos 2 sql sql-server sql-server-2008-r2

我有一个问题,我认为其中一个问题会在底部解决但我仍然有问题.问题是我的案例陈述是错误的(但运行没有错误)但不确定我还缺少什么.

我的目标是,如果DueDate为NULL,因为Table2中没有记录,因此我想要的是将此值显示为"No"而不是"NULL".我在我的代码中添加了"IsNull",但还没有解决我的问题.我在这些论坛上看过ISNULL()和COALEASE()但无法得到我想要的结果

以下是我的工作代码:

SELECT 
    Client, 
    COUNT(*) AS ReadyRecords, 
    (SELECT COUNT(*) FROM Table1 EPR WHERE actioned=8 AND EPR.Client=Table1.Client) AS Outstanding, 
    (SELECT TOP 1 
        CASE 
            WHEN DueDate < GETDATE() THEN 'Yes' 
            WHEN DueDate IS NULL THEN 'No' 
        ELSE 'No' 
        END AS DueDate
    FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate) AS DueDate

    FROM Table1 WHERE Actioned=2 GROUP BY Client
Run Code Online (Sandbox Code Playgroud)

编辑:

当前结果集:

Client   | ReadyRecords  |  Outstanding  |  DueDate

Test     |     42        |      54       |   NULL
Stack    |     150       |      10       |   NULL
JBloggs  |     32        |      28       |   Yes
DBloggs  |     2         |      17       |   Yes
Overflow |     1         |      1        |   No
Run Code Online (Sandbox Code Playgroud)

期望的结果集:

Client   | ReadyRecords  |  Outstanding  |  DueDate

Test     |     42        |      54       |   No
Stack    |     150       |      10       |   No
JBloggs  |     32        |      28       |   Yes
DBloggs  |     2         |      17       |   Yes
Overflow |     1         |      1        |   No
Run Code Online (Sandbox Code Playgroud)

表格1:

id      |  Client   |   Actioned  | etc...

5245    |  Test     |      8      | etc...
....so on
Run Code Online (Sandbox Code Playgroud)

表2:

id   |   Client   |   DueDate

1    |  JBloggs   | 2012-12-01 00:00:00.000
2    |  DBloggs   | 2012-12-05 00:00:00.000
3    |  Overflow  | 2012-12-12 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

需要帮助请叫我.

相似/相关问题:

ype*_*eᵀᴹ 5

您需要将ISNULL()or或COALESCE()函数应用于整个内联子查询,如下所示:

SELECT 
    Client, 
    COUNT(*) AS ReadyRecords, 
    (SELECT COUNT(*) FROM Table1 EPR 
     WHERE actioned=8 AND EPR.Client=Table1.Client
    ) AS Outstanding, 

    COALESCE(
        (SELECT TOP 1 
            CASE 
                WHEN DueDate < GETDATE() THEN 'Yes' 
            END AS DueDate
        FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate
        ), 'No' 
    ) AS DueDate

FROM Table1  WHERE Actioned=2  GROUP BY Client ;
Run Code Online (Sandbox Code Playgroud)

或者在CASE那里移动表达式:

SELECT 
    Client, 
    COUNT(*) AS ReadyRecords, 
    (SELECT COUNT(*) FROM Table1 EPR 
     WHERE actioned=8 AND EPR.Client=Table1.Client
    ) AS Outstanding, 

    CASE WHEN 
           (SELECT TOP 1 
              DueDate
            FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate
           ) < GETDATE() 
        THEN 'Yes'
        ELSE 'No'
    END AS DueDate

FROM Table1  WHERE Actioned=2  GROUP BY Client ;
Run Code Online (Sandbox Code Playgroud)