Создать столбцы, в которых суммируются другие столбцы на основе условных значений других столбцов? - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно создать столбцы, в которых суммируются другие столбцы на основе условных значений других столбцов. Требование приведено ниже.

У меня есть следующая таблица:

key code1  code2 code3 code4 value1 value2 value3 value4 
0    101   101   101   101   1000    1000  1000   1000    
1    101   101   101   201   1000    1000  1000   1000    
2    101   101   201   201   1000    1000  1000   1000    
3    101   201   201   201   1000    1000  1000   1000    
4    101   201   201   301   1000    1000  1000   1000    
5    101   201   301   301   1000    1000  1000   1000    
6    101   301   301   301   1000    1000  1000   1000    
7    101   101   101   301   1000    1000  1000   1000    
8    101   201   301   0     1000    1000  1000   0       
9    101   301   0     0     1000    1000  0      0       
....

Мне нужно создать один столбец, чтобы суммировать значение столбца (значение1, значение2, значение3, значение4) с учетом столбцов код (код1, код2, код3, код4). Результат должен быть таким:

key  code1 code2 code3 code4 value1 value2 value3 value4 sum_code_101 sum_code_201 sum_code_301
0    101   101   101   101   1000    1000  1000   1000     4000           0           0
1    101   101   101   201   1000    1000  1000   1000     3000           1000        0
2    101   101   201   201   1000    1000  1000   1000     2000           2000        0
3    101   201   201   201   1000    1000  1000   1000     1000           3000        0
4    101   201   201   301   1000    1000  1000   1000     1000           2000        1000
5    101   201   301   301   1000    1000  1000   1000     1000           1000        2000
6    101   301   301   301   1000    1000  1000   1000     1000           0           3000
7    101   101   101   301   1000    1000  1000   1000     3000           0           1000
8    101   201   301   0     1000    1000  1000   0        1000           1000        1000
9    101   301   0     0     1000    1000  0      0        1000           0           1000  

Поскольку в реальной таблице 25 различных кодов (101, 201, 301 ...), мне нужно создать 25 столбцов, чтобы суммировать их значения.

Любая помощь будет очень признательна.

1 Ответ

1 голос
/ 30 мая 2020

Вы можете использовать case выражения:

select
    t.*,
    case when code1 = 101 then value1 else 0 end
        + case when code2 = 101 then value2 else 0 end
        + case when code3 = 101 then value3 else 0 end
        + case when code4 = 101 then value4 else 0 end
        as sum_code_101,
    case when code1 = 201 then value1 else 0 end
        + case when code2 = 201 then value2 else 0 end
        + case when code3 = 201 then value3 else 0 end
        + case when code4 = 201 then value4 else 0 end
        as sum_code_201,
    case when code1 = 301 then value1 else 0 end
        + case when code2 = 301 then value2 else 0 end
        + case when code3 = 301 then value3 else 0 end
        + case when code4 = 301 then value4 else 0 end
        as sum_code_301
from mytable t

Вы можете немного сократить синтаксис, отменив разворот строк вирт cross apply, а затем используя условное агрегирование:

select
    t.*,
    s.*
from mytable t
outer apply (
    select 
        sum(case when code = 101 then val else 0 end) sum_code_101,
        sum(case when code = 201 then val else 0 end) sum_code_201,
        sum(case when code = 301 then val else 0 end) sum_code_301,
        sum(case when code = 401 then val else 0 end) sum_code_401
    from (values 
        (t.code1, t.value1), 
        (t.code2, t.value2), 
        (t.code3, t.value3), 
        (t.code4, t.value4)
    ) as x(code, val)
)  s
...