我有这样的数据:
account period01 period02 period03 period04
-----------------------------------------------------------
1111 null null null null
1112 782 null null null
1113 null null null 345
1114 765 882 67 321
我想要做的是从period1到period04获取值,并使用最后一个值来编码accoutperiod的值。
因此,如果value来自period1,则将其编码为01,将period2编码为02,将period03编码为03,将period04编码为04.
最后,输出应该是这样的
account period01 period02 period03 period04 accoutperiod
--------------------------------------------------------------------------
1111 null null null null null
1112 782 null null null 01
1113 null null null 345 04
1114 765 882 67 321 04
答案 0 :(得分:2)
您可以像这样使用CASE
。
SELECT account, period01, period02, period03, period04,
CASE
WHEN period04 IS NOT NULL THEN '04'
WHEN period03 IS NOT NULL THEN '03'
WHEN period02 IS NOT NULL THEN '02'
WHEN period01 IS NOT NULL THEN '01'
ELSE NULL END as accoutperiod
From YourTable
答案 1 :(得分:0)
尽管@ughai的答案会帮助你得到你需要的东西,但它无法解释你'CASE'语句在sql中是如何工作的。
希望我的样本能够指导您使用案例的方式 多个'WHEN'语句。
让我们考虑你的表。
;WITH cte (account, period01, period02, period03, period04)
AS
(
SELECT
1111, NULL, NULL, NULL, NULL
UNION ALL
SELECT
1112, 782, NULL, NULL, NULL
UNION ALL
SELECT
1113, NULL, NULL, NULL, 345
UNION ALL
SELECT
1114, 765, 882, 67, 321
)
以下查询是每个人为达到我们的结果所做的常见错误。
SELECT
account,
period01,
period02,
period03,
period04,
CASE
WHEN period01 IS NOT NULL THEN '01'
WHEN period02 IS NOT NULL THEN '02'
WHEN period03 IS NOT NULL THEN '03'
WHEN period04 IS NOT NULL THEN '04'
ELSE NULL END AS [accoutperiod]
FROM
cte
以上查询会给您以下结果:
╔═════════╦══════════╦══════════╦══════════╦══════════╦══════════════╗
║ account ║ period01 ║ period02 ║ period03 ║ period04 ║ accoutperiod ║
╠═════════╬══════════╬══════════╬══════════╬══════════╬══════════════╣
║ 1111 ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║
║ 1112 ║ 782 ║ NULL ║ NULL ║ NULL ║ 01 ║
║ 1113 ║ NULL ║ NULL ║ NULL ║ 345 ║ 04 ║
║ 1114 ║ 765 ║ 882 ║ 67 ║ 321 ║ 01 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
由于案例中的第一个陈述具有 WHEN period01 IS NOT NULL 然后'01' ,所以声明在第一次尝试中获得成功 执行。
现在让我们以相反的顺序重新排序WHEN语句。
SELECT
account,
period01,
period02,
period03,
period04,
CASE
WHEN period04 IS NOT NULL THEN '04'
WHEN period03 IS NOT NULL THEN '03'
WHEN period02 IS NOT NULL THEN '02'
WHEN period01 IS NOT NULL THEN '01'
ELSE NULL END AS [accoutperiod]
FROM
cte
以上查询会给您以下结果:
╔═════════╦══════════╦══════════╦══════════╦══════════╦══════════════╗
║ account ║ period01 ║ period02 ║ period03 ║ period04 ║ accoutperiod ║
╠═════════╬══════════╬══════════╬══════════╬══════════╬══════════════╣
║ 1111 ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║
║ 1112 ║ 782 ║ NULL ║ NULL ║ NULL ║ 01 ║
║ 1113 ║ NULL ║ NULL ║ NULL ║ 345 ║ 04 ║
║ 1114 ║ 765 ║ 882 ║ 67 ║ 321 ║ 04 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝