SQL Server 2014:使用列中的值为新列生成新值

时间:2015-10-26 08:56:26

标签: sql sql-server tsql

我有这样的数据:

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  

2 个答案:

答案 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           ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝