CASE 语句 SQL 处理数据问题

CASE Statement SQL handle data issue

我正在尝试创建计算来处理棘手的数据问题。

我需要在填充出生日期字段时衡量帐户的交易何时 运行。

有时在数据中,一个帐户可以有 2 个人,如果只有其中一个人的出生日期被填充,并且时间戳相同,那么这算作日期为出生人口稠密。我不想计算此实例中的第二行,它的出生日期值为空。

我一直在尝试在 case 语句中使用 Y/N 标志或 0/1 计数,但我还没有想出如何处理第二个空白行。

这是我一直在使用的基本 CASE 语句:

SELECT DISTINCT
    [Account_Nbr],
    [Timestmp],
    CASE 
       WHEN [DOB] <> '   ' THEN 'Y' 
       ELSE 'N' 
    END AS 'DOB ORDERED'
FROM 
    TABLE
GROUP BY
    [Account_Nbr], [Timestmp], [DOB]

示例数据如下 - 我想将此标记为已处理并填充 DOB 的交易,但我不希望将空白 DOB 计数或标记为 N

关于如何处理这个问题有什么想法吗?谢谢

如果我理解正确的话,这是一个可能的解决方案,用于从具有多个记录

的account_nbr中只返回一行
-- Just inserting sample data here.
WITH CTE AS (
SELECT Account_Nbr = 123, Timestmp = GETDATE() , Operator =  1, DOB = '19700101'
UNION ALL
SELECT Account_Nbr = 123, Timestmp = GETDATE() , Operator =  2, DOB = '   ')

--No distinct necessary since it will always group by account_nbr and timestamp.
SELECT  Account_Nbr,
        Timestmp,
        DOB_Ordered = (CASE WHEN MAX(DOB) <> '   '  THEN 'Y' ELSE 'N' END)
FROM CTE
GROUP BY
    [Account_Nbr], [Timestmp]

我认为您想要使用 CASE 表达式进行聚合:

SELECT Account_Nbr, Timestmp,
       (CASE WHEN COUNT(*) = COUNT(DOB) THEN 'Y' ELSE 'N'
        END) as missing_dob_flag
FROM TABLE
GROUP BY [Account_Nbr], [Timestmp]

假设名为 DOB(出生日期)的列存储为日期是合理的。日期应作为日期存储在数据库中。如果不是这种情况,您应该修复数据模型。

如果您对其他人关于数据类型的非常糟糕的决定感到困惑,您可以使用 TRY_CONVERT():

SELECT Account_Nbr, Timestmp,
       (CASE WHEN COUNT(*) = COUNT(TRY_CONVERT(DATE, DOB)) THEN 'Y' ELSE 'N'
        END) as missing_dob_flag
FROM TABLE
GROUP BY [Account_Nbr], [Timestmp];

请注意,转换可能需要格式参数。