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];
请注意,转换可能需要格式参数。
我正在尝试创建计算来处理棘手的数据问题。
我需要在填充出生日期字段时衡量帐户的交易何时 运行。
有时在数据中,一个帐户可以有 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];
请注意,转换可能需要格式参数。