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:
- Eerste tafel zonder
None
records (s1.country <> 'None'
) - Tweede tafel alleen
None
records (s2.country = 'None'
) - 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