sql сводит два столбца к одинаковым значениям столбца - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь преобразовать данные, и до сих пор несколько успешно это сделал, но сейчас зашел в тупик и ищу помощи по моей проблеме.

У меня есть четыре столбца в моих данных. Cat1 (старая категория), val1 (старое значение), cat2 (новая или текущая категория) и val2 (его текущее значение.

Я хочу, чтобы для каждой комбинации кошки 1 и кошки 2 было val2, отрицательное значение для старой категории в соответствующем столбце и положительное значение для новой категории.

пример данных:

 cat1   cat2   val1   val2
 A      B      10     30
 A      A      5      20
 C      A      33     15
 B      C      23     20
 B      A      14     5
 C      B      18     20
 A      B      14     0

Результат, который я ищу:

change     A     B    C
AtoB      -30   +30   
AtoC       0          0
BtoA      -5     +5
BtoC             -20  +20
CtoA      +15        -15
CtoB            +20  -20

Я успешно, используя pivot & unpivot с помощью предложения CASE, создал таблицу, которая учитывает только один из столбцов. Поэтому я получаю только одно значение в строке:

select * from (select
cat1
SUM(
    CASE WHEN cat1 = A AND cat2 = B THEN val2*-1 ELSE 0 END 
  ) AtoB,
SUM(
    CASE WHEN cat1 = A AND cat2 = C THEN val2*-1 ELSE 0 END 
  ) AtoC,
SUM(
    CASE WHEN cat1 = B AND cat2 = C THEN val2*-1 ELSE 0 END 
  ) BtoC,
SUM(
    CASE WHEN cat1 = C AND cat2 = B THEN val2*-1 ELSE 0 END 
  ) CtoB,
SUM(
    CASE WHEN cat1 = C AND cat2 = A THEN val2*-1 ELSE 0 END 
  ) CtoA,
SUM(
    CASE WHEN cat1 = B AND cat2 = A THEN val2*-1 ELSE 0 END 
  ) BtoA
 FROM table
  group by cat1,cat2)
  unpivot (
  value for cat in 
 (AtoB,AtoC,BtoC,CtoB,CtoA,BtoA)) up
pivot (
sum(value) for cat1 in ('A','B','C')

проблема здесь в том, что я получаю значение только для cat1, а не для cat2, несмотря на то, что они разделяют значения. Одно из решений, которое я могу придумать, - это создать сложное объединение или сохранить эту таблицу, а затем создать новое предложение CASE для каждой строки, чтобы дублировать значения, умноженные на -1, но чувствую, что оба эти решения не очень хороши, и что есть лучшее решение, которое мне не хватает.

После предложения об удалении я получаю:

cat1     cat   value
A        AtoB   -30
A        AtoC    0
B        Bto    0
B        AtoB   0
...      ...    ...

, который оператор PIVOT преобразует в

cat        A     B    C
AtoB      -30      
AtoC                 
BtoA              -5    
BtoC             -23
CtoA                 -15
CtoB                 -20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...