PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Assegna il valore totale del mese a ogni giorno del mese

demo:db<>violino

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)

Hai bisogno di un naturale self-join. Le condizioni di adesione sono:

  1. Primo tavolo senza None record (s1.country <> 'None' )
  2. Seconda tabella solo None record (s2.country = 'None' )
  3. Data:considera solo la parte di anno e mese, ignora i giorni. Ciò può essere ottenuto normalizzando le date di entrambe le tabelle al primo del mese utilizzando date_trunc() . Quindi, ad es. '2020-02-15' risulta in '2020-02-01' e '2020-02-29' risulta in '2020-02-01' anche, che funziona bene come confronto e condizione di unione.

In alternativa :

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'

Puoi usare SUM() funzione finestra sul gruppo di date_trunc() come descritto sopra. Quindi è necessario filtrare None record in seguito