sql >> Database >  >> RDS >> PostgreSQL

Wijs de totale waarde van de maand toe aan elke dag van de maand

demo's: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)

Je hebt een natuurlijke self-join nodig. Deelnamevoorwaarden zijn:

  1. Eerste tafel zonder None records (s1.country <> 'None' )
  2. Tweede tafel alleen None records (s2.country = 'None' )
  3. Datum:houd alleen rekening met jaar- en maandgedeelte, negeer dagen. Dit kan worden bereikt door de datums van beide tabellen te normaliseren naar de eerste van de maand met behulp van date_trunc() . Dus bijv. '2020-02-15' resulteert in '2020-02-01' en '2020-02-29' resulteert in '2020-02-01' ook, wat goed werkt als vergelijkings- en lidmaatschapsvoorwaarde.

Alternatief :

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'

U kunt de SUM() . gebruiken vensterfunctie over de groep van date_trunc() zoals hierboven beschreven. Dan moet je de None . filteren neemt daarna op



  1. Slechte tekens bij het afdrukken van tekst uit utf8_unicode_ci Mysql-tabel

  2. 20-30 gelijktijdige mysql-verbindingen zorgen ervoor dat RDS boven de 80% stijgt

  3. Bescherming tegen SQL-injectie

  4. MySQL voegt een NOT NULL-kolom toe