sql >> Databáze >  >> RDS >> Oracle

Otázka v rozhovoru:Jak získat agregaci za poslední 3 měsíce na úrovni sloupců?

Nejprve budete muset sečíst údaje za měsíc a poté pomocí funkce MAS získat údaje z předchozích měsíců následovně:

SELECT ORDER_MONTH, LAG(UNIT_OF_PHONE_SALE, 1) OVER( ORDER BY ORDER_MONTH ) AS "M-1_Sale", LAG(UNIT_OF_PHONE_SALE, 2) OVER( ORDER BY ORDER_MONTH ) AS "M-2_Sale", LAG(UNIT_OF_PHONE_SALE, 3) OVER( ORDER BY ORDER_MONTH ) AS "M-3_Sale" FROM ( SELECT TO_CHAR(ORDERDATE, 'YYYYMM') AS ORDER_MONTH, SUM(UNIT_OF_PHONE_SALE) AS UNIT_OF_PHONE_SALE FROM DATAA GROUP BY TO_CHAR(ORDERDATE, 'YYYYMM') ) ORDER BY ORDER_MONTH DESC;

Výstup:

ORDER_   M-1_Sale   M-2_Sale   M-3_Sale
------ ---------- ---------- ----------
201908       3789        789        666
201907        789        666        765
201906        666        765
201905        765
201904
 

db<>ukázka houslí

Na zdraví!!

- Aktualizovat --

Pro požadavek uvedený v komentářích bude fungovat následující dotaz.

CTE AS (
    SELECT
        TRUNC(ORDERDATE, 'MONTH') AS ORDER_MONTH,
        SUM(UNIT_OF_PHONE_SALE) AS UNIT_OF_PHONE_SALE
    FROM
        DATAA
    GROUP BY
        TRUNC(ORDERDATE, 'MONTH')
)

SELECT
    TO_CHAR(C.ORDER_MONTH,'YYYYMM') as ORDER_MONTH,
    NVL(C1.UNIT_OF_PHONE_SALE, 0) AS "M-1_Sale",
    NVL(C2.UNIT_OF_PHONE_SALE, 0) AS "M-2_Sale",
    NVL(C3.UNIT_OF_PHONE_SALE, 0) AS "M-3_Sale"
FROM
    CTE C
    LEFT JOIN CTE C1 ON ( C1.ORDER_MONTH = ADD_MONTHS(C.ORDER_MONTH, - 1) )
    LEFT JOIN CTE C2 ON ( C2.ORDER_MONTH = ADD_MONTHS(C.ORDER_MONTH, - 2) )
    LEFT JOIN CTE C3 ON ( C3.ORDER_MONTH = ADD_MONTHS(C.ORDER_MONTH, - 3) )
ORDER BY
    C.ORDER_MONTH DESC
 

Výstup:

db<>ukázka houslí z aktualizované odpovědi.

Na zdraví!!



  1. Jak zabránit smazání prvního řádku v tabulce (PostgreSQL)?

  2. Tabulka ALTER TABLE AUTO_INCREMENT =$x

  3. ORA-22054 Chyba podtečení

  4. Funkce podmíněného vedení/zpoždění PostgreSQL?