Tworzenie nowej kolumny dla określonego warunku 'case'

0

Cześć,
Oracle SQL
Czy mógłby mi ktoś podpowiedzieć jakiej składni użyć. Spójrzcie na pogrubiony warunek. Co chcę osiągnąć.
Przykładowo dla warunku:

WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 31 AND 60 THEN '31_60'

chciałbym aby została utworzona nowa kolumna '31_60' i do tej kolumny została przeniesiona wartość z kolumny T0.INVOICE_AMOUNT, dla faktury, która spełnia ten warunek, tzn.:
przykładowo wartość w kolumnie 'OKRES_SPLATY' dla tej faktury/ danej = 35. To samo dla pozostałych warunków.

SELECT T0.IDENTITY AS NR_KONTRAHENTA, T0.SUPPLIER_NAME AS NAZWA_KONTRAHENTA, T0.ASSOCIATION_NO AS NIP, T0.VOUCHER_DATE_REF AS DATA_PK, T0.VOUCHER_NO_REF AS NUMER_PK, T0.VOUCHER_TYPE_REF AS TYP_PK
       ,T0.ACCOUNTING_YEAR_REF AS ROK, T0.PRELIM_CODE AS KOD_WST, T0.LEDGER_ITEM_ID AS NUMER_FAKTURY, T0.LEDGER_ITEM_SERIES_ID AS TYP_FAKTURY,
CASE
  WHEN T1.CORRECTION_INVOICE = 'FALSE' THEN 'NIE'
  WHEN T1.CORRECTION_INVOICE = 'TRUE' THEN 'TAK'
END AS CZY_FAKT_KORYG,
CASE
  WHEN T1.CORRECTION_EXISTS = 'FALSE' THEN 'NIE'
  WHEN T1.CORRECTION_EXISTS = 'TRUE' THEN 'TAK'
  END AS CZY_JEST_KOREKTA
       ,T1.NCF_REFERENCE AS ODN_DO_PLATN, T0.PAY_TERM_BASE_DATE AS DATA_WAR_PLATN, T0.PAY_TERM_ID AS WAR_PLATN, T0.INVOICE_DATE AS DATA_FAKTURY, T0.ARRIVAL_DATE AS DATA_WPLYWU, T0.DUE_DATE AS NOWY_TERMIN_PŁATNOSCI, T0.FIRST_PLANNED_DATE AS NAST_PLAN_DATA_PLATN
       ,T1.PL_PAY_DATE AS PLANOW_DATA_PLATN,
CASE
  WHEN T0.ONE_TIME = 'FALSE' THEN 'NIE'
  WHEN T0.ONE_TIME = 'TRUE' THEN 'TAK'
  END AS CZY_PLATN_O_CZASIE,
CASE
  WHEN T1.INSTALLMENT_PLAN = 'FALSE' THEN 'NIE'
  WHEN T1.INSTALLMENT_PLAN = 'TRUE' THEN 'TAK'
  END AS SYSTEM_RATALNY      
        ,T0.NET_AMOUNT AS KWOTA_NETTO_FAKT, T0.VAT_AMOUNT AS KWOTA_VAT, T0.INVOICE_AMOUNT AS KWOTA_FAKTURY, T0.ACTUAL_NET_AMOUNT AS AKT_ZAPL_KWOTA, T0.OPEN_AMOUNT AS KWOTA_OTWARTA, (T1.PL_PAY_DATE - T0.INVOICE_DATE) AS ILOSC_DNI,
**<u>CASE
  WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) <= 30 THEN '0_30'
  END AS TEST))
  WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 31 AND 60 THEN '31_60'
  WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 61 AND 120 THEN '61_120'
  WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) >= 121 THEN 'POW_120'
END AS OKRES_SPLATY</u>**
        ,T0.INV_STATE AS STATUS_FAKTURY, T0.AUTH_ID AS AUTORYZACJA
FROM IFSAPP.INVOICE_LEDGER_ITEM_SU_QRY T0
JOIN IFSAPP.INCOMING_INVOICE2 T1 ON T0.INVOICE_ID = T1.INVOICE_ID
WHERE T0.INVOICE_DATE between to_date( '20220101', 'YYYYMMDD' ) and to_date( '20221231', 'YYYYMMDD' ) + ( 1 - 1/ ( 60*60*24 ) ) 
--AND T0.LEDGER_ITEM_ID = '0007/06/2022/FVS'
ORDER BY T0.INVOICE_DATE ASC;

Pozdrawiam

1
      CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) <= 30 THEN  T0.INVOICE_AMOUNT ELSE null END "0_30",
       CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 31 AND 60 THEN  T0.INVOICE_AMOUNT ELSE null END "31_60",
       CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 61 AND 120 THEN  T0.INVOICE_AMOUNT ELSE null END "61-120",
       CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) > 120 THEN  T0.INVOICE_AMOUNT ELSE null END "POW_120"     
0

Dzięki, działa.

0

A jak to rozbudować tak aby, dla tego warunku: CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) <= 30 THEN T0.INVOICE_AMOUNT ELSE null END "0_30" zamiast ELSE "null" ustawić tak aby wartość T0.INVOICE_AMOUNT przeniósł do dwóch utworzonych kolumn, np. "0_30" i np. "Po_terminie", a jeśli warunek nie będzie spełniony to do trzeciej utworzonej kolumny, np,"w_terminie" Szukam, czytam o "case", "multi case" ale nie udaje mi się znaleźć odpowiedniego rozwiązania

Odpowiadaj w postach

Ja nie rozumiem co ty chcesz osiągnąć.W selekcie definiujemy kolumny które mają być zwrócone. To się nie da przenieść nic z jednej do drugiej. Czyli jeżeli coś ma się pokazywać w kilku kolumnach to musisz dopasować warunki np.:

        CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) <= 30 THEN  T0.INVOICE_AMOUNT ELSE null END "0_30",
       CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 31 AND 60 THEN  T0.INVOICE_AMOUNT ELSE null END "31_60",
       CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) BETWEEN 61 AND 120 THEN  T0.INVOICE_AMOUNT ELSE null END "61-120",
       CASE WHEN (T1.PL_PAY_DATE - T0.INVOICE_DATE) > 120 THEN  T0.INVOICE_AMOUNT ELSE null END "POW_120" ,
       CASE
          WHEN T0.ONE_TIME = 'FALSE' THEN 0
          WHEN T0.ONE_TIME = 'TRUE' THEN T0.INVOICE_AMOUNT
          END AS W_terminie,
       CASE
          WHEN T0.ONE_TIME = 'FALSE' THEN T0.INVOICE_AMOUNT
          WHEN T0.ONE_TIME = 'TRUE' THEN 0
          END AS po_terminie,
          
0

Witaj,
Dzięki za odpowiedź.
Chciałem znaleźć rozwiązanie jak dla jednego warunku 'case' można było osiągnąć kilka wyników, tzn.: jeśli warunek 1 true wynik A i B, a jeśli false wynik C. Nie wiem jak działa i czy istniej multicase w Oracle. Szukam jakiejś lektury ciekawej.

1

jeśli warunek 1 true wynik A i B, a jeśli false wynik C

Co to znaczy wynika A i B, case zwraca jeden wynik nie dwa?

Możesz zagnieżdżać casy i tworzyć wiele warunków, ale tak opisujesz, że ja nie potrafię się połapać

Kilka warunków:

case 
    when a>0 then A
    when a<0 and b=0 then C
    else
       X
END
--lub
case 
    when a>0 then A
    when a<0 and b=0 then C
    when c = 0 then x
END
--lub zagniezdzony
case 
    when a>0 then 
         case user = 'alek' then 'alek' else 'nie alek' end
    when a<0 and b=0 then C
    else
       X
END

1 użytkowników online, w tym zalogowanych: 0, gości: 1