sql >> Databáze >  >> RDS >> PostgreSQL

Ke každému dni v měsíci přiřaďte celkovou hodnotu měsíce

demos:db<>fiddle

SELECT
    s1.sales_date,
    s1.country,
    s1.sales_volume,
    s2.fix_costs
FROM sales s1
JOIN sales s2 ON s1.country <> 'None' AND s2.country = 'None' 
    AND date_trunc('month', s1.sales_date) = date_trunc('month', s2.sales_date)

Potřebujete přirozené vlastní spojení. Podmínky připojení jsou:

  1. První tabulka bez None záznamy (s1.country <> 'None' )
  2. Pouze druhá tabulka None záznamy (s2.country = 'None' )
  3. Datum:Berte v úvahu pouze část roku a měsíce, dny ignorujte. Toho lze dosáhnout normalizací dat obou tabulek na první v měsíci pomocí date_trunc() . Takže např. '2020-02-15' výsledkem je '2020-02-01' a '2020-02-29' výsledkem je '2020-02-01' také, což funguje dobře jako podmínka porovnávání a spojení.

Alternativně :

SELECT
    *
FROM (
    SELECT
        sales_date,
        country,
        sales_volume,
        SUM(fix_costs) OVER (PARTITION BY date_trunc('month', sales_date)) as fix_costs
    FROM sales 
) s
WHERE country <> 'None'

Můžete použít SUM() okenní funkce nad skupinou date_trunc() jak je popsáno výše. Pak musíte filtrovat None záznamy poté



  1. Jak přetypuji řetězec na celé číslo a budu mít 0 v případě chyby při přetypování s PostgreSQL?

  2. Filtrovat podle COUNT(*)?

  3. Mysql - Proměnná uložené procedury OUT vrací hodnotu null

  4. Instalace apt-get oracle java 7 přestala fungovat