PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Affecter la valeur totale du mois à chaque jour du mois

démos :db<>violon

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)

Vous avez besoin d'une auto-jointure naturelle. Les conditions d'adhésion sont :

  1. Premier tableau sans None enregistrements (s1.country <> 'None' )
  2. Deuxième table seulement None enregistrements (s2.country = 'None' )
  3. Date :ne considérez que l'année et le mois, ignorez les jours. Ceci peut être réalisé en normalisant les dates des deux tables au premier du mois en utilisant date_trunc() . Ainsi, par ex. '2020-02-15' résultats en '2020-02-01' et '2020-02-29' résultats en '2020-02-01' également, ce qui fonctionne bien comme condition de comparaison et de jointure.

Alternativement :

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'

Vous pouvez utiliser le SUM() fonction de fenêtre sur le groupe de date_trunc() comme décrit ci-dessus. Ensuite, vous devez filtrer le None enregistre ensuite