sql >> Databasteknik >  >> RDS >> PostgreSQL

Tilldela månadens totala värde till varje dag i månaden

demos:db<>fiol

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)

Du behöver en naturlig självanslutning. Anslutningsvillkor är:

  1. Första tabellen utan None poster (s1.country <> 'None' )
  2. Andra tabellen endast None poster (s2.country = 'None' )
  3. Datum:Tänk bara på år och månad, ignorera dagar. Detta kan uppnås genom att normalisera datumen för båda tabellerna till den första i månaden genom att använda date_trunc() . Så, t.ex. '2020-02-15' resulterar i '2020-02-01' och '2020-02-29' resulterar i '2020-02-01' också, vilket fungerar bra som jämförelse- och sammanfogningsvillkor.

Alternativt :

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'

Du kan använda SUM() fönsterfunktion över gruppen date_trunc() som beskrivits ovan. Sedan måste du filtrera None poster efteråt



  1. Kan inte ansluta till PostgreSQL med PHP pg_connect()

  2. Skriv över MySQL-tabeller med AWS Glue

  3. Grundläggande säkerhet, PHP mySQl

  4. Autoincrement Primär nyckel i Oracle-databasen