2015-10-26 2 views
0

У меня есть данные, как это:SQL Server 2014: используя значения из столбцов для создания нового значения для нового столбца

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 

То, что я хочу сделать, это получить значения из периода1 через period04 и использовать последнее значение для кодирования значения accoutperiod.

Таким образом, если значение из периода1, то его код как 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

Вы можете использовать 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 
+0

Что я понял, для случая утверждения когда значение соответствует выражению, оператор СЛУЧАЯ будет выполнять соответствующие заявления, а не оценивать любого в дальнейшем. Таким образом, в этом случае, если период с 1 по 4-й период имеет значение, оператор case всегда будет возвращен 01. – user1902849

+0

Просто измените порядок инструкций 'WHEN', начиная с period04 и заканчивая period01 - это должно сделать трюк. – Dan

+0

@jpw и Dan Я согласен. Формулировка в вопросе меня смутила :) – ughai

0

Несмотря на то, что ответ @ughai поможет вам получить то, что вам нужно, но он не сможет объяснить вам, как работает оператор CASE в sql.

Надеюсь, что мой образец проведет вас так, как это работает с несколькими инструкциями «КОГДА».

Давайте рассмотрим ваш стол.

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

С первым оператором в случае имеет КОГДА period01 IS NOT NULL THEN '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   ║ 
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝ 
Смежные вопросы