PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Weisen Sie jedem Tag des Monats den Gesamtwert des Monats zu

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)

Sie brauchen eine natürliche Selbstverbindung. Beitrittsbedingungen sind:

  1. Erster Tisch ohne None Aufzeichnungen (s1.country <> 'None' )
  2. Zweiter Tisch nur None Aufzeichnungen (s2.country = 'None' )
  3. Datum:Nur Jahres- und Monatsteil berücksichtigen, Tage ignorieren. Dies kann erreicht werden, indem die Daten beider Tabellen mit date_trunc() auf den Ersten des Monats normalisiert werden . Also z.B. '2020-02-15' ergibt '2020-02-01' und '2020-02-29' ergibt '2020-02-01' auch, was gut als Vergleichs- und Join-Bedingung funktioniert.

Alternativ :

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'

Sie können die SUM() verwenden Fensterfunktion über die Gruppe date_trunc() wie oben beschrieben. Dann müssen Sie None filtern Aufzeichnungen danach