SQL Server 2014:使用列中的值为新列生成新值
我有这样的数据:SQL Server 2014:使用列中的值为新列生成新值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有这样的数据: account period01 period02 period03 period04 ----------------------------------------------------------- 1111 null null null null 1112 782 null null null 1113
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获取值,并使用最后一个值对AccountPeriod的值进行编码
所以,如果值来自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
您可以像这样使用
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
尽管@ughai answer将帮助您获得所需的内容,但它无法解释“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 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
╔═════════╦══════════╦══════════╦══════════╦══════════╦══════════════╗
║ 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 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
因为当period01不为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 ║ 01 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
╔═════════╦══════════╦══════════╦══════════╦══════════╦══════════════╗
║ 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 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
我对case语句的理解是,一旦一个值与表达式匹配,case语句将执行相应的语句,而不会进一步求值。所以在这种情况下,如果period1到period4有值,case语句将始终重新运行01。只需重新排列
WHEN
语句的顺序,从period04开始,以period01结束-这应该可以做到。@jpw和Dan我同意。问题中的措辞让我感到困惑:)我们可以在create table语句中使用case语句作为默认值吗?@user1902849-您可以基于这个case
表达式创建一个计算列