【问题标题】:CASE Statement SQL handle data issueCASE 语句 SQL 处理数据问题
【发布时间】:2020-11-07 00:30:49
【问题描述】:

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

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

有时在数据中,一个帐户可以有 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

关于如何处理这个问题的任何想法?谢谢

【问题讨论】:

  • 这里的大多数人希望样本表数据和预期结果为格式化文本,而不是图像。
  • 顺便说一句,这是一个 case expression(它返回一个值。) case statement 可以在存储过程中用于条件执行代码.)
  • 你能添加你想要的输出吗?
  • DOB的数据类型是什么?日期与字符串的比较没有意义。

标签: sql sql-server case


【解决方案1】:

如果我理解正确,这可能是从具有多条记录的 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]

【讨论】:

  • 感谢您的建议!我很感激,我会玩这些,看看我能得到什么!
【解决方案2】:

我认为您希望使用 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];

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

【讨论】:

  • 这将始终返回 Y,因为他显然没有在 DOB 列中使用 NULL 值
  • 感谢您的建议!我很感激,我会玩这些,看看我能得到什么!
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多