Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2014:使用列中的值为新列生成新值_Sql_Sql Server_Tsql - Fatal编程技术网

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
表达式创建一个计算列