Я пытаюсь преобразовать данные, и до сих пор несколько успешно это сделал, но сейчас зашел в тупик и ищу помощи по моей проблеме.
У меня есть четыре столбца в моих данных. 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