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

Hvordan man betinget summerer to kolonner i PostgreSQL 9.3

Du kan gøre det med en underforespørgsel, hvis dine versioner af PostgreSQL (endnu) ikke tillader vinduesfunktioner):

WITH t (month, marketid, totalsold, totalshipped, lefttoship_thismonth) AS(VALUES ('01-01-2015'::date, 1, 100, 50, 50), ('01-01-2015) '::dato, 2, 10, 3, 7), ('01-01-2015'::dato, 3, 0, 0, 0), ('01-02-2015'::dato, 1, 0 , 50, -50), ('01-02-2015'::dato, 2, 20, 0, 20), ('01-02-2015'::dato, 3, 0, 0, 0) )VÆLG month, marketid, totalsold, totalshipped, lefttoship_thismonth, (SELECT sum(lefttoship_thismonth) FROM t t2 WHERE t2.marketid =t1.marketid AND t2.month <=t1.month ) AS total_leftFROM t t1ORDER BY month, marketid

ville give dig følgende resultat:

|------------+-----------+----------+------- -------+-----------------------------+--------|| måned | markedsid | samlet solgt | samlet afsendt | lefttoship_thismonth | total_left ||----------------------------------- ---+-----------------------------+------------|| 01-01-2015 | 1 | 100 | 50 | 50 | 50 ||----------------------------------- ---+-----------------------------+------------|| 01-01-2015 | 2 | 10 | 3 | 7 | 7 ||----------------------------------- ---+-----------------------------+------------|| 01-01-2015 | 3 | 0 | 0 | 0 | 0 ||----------------------------------- ---+-----------------------------+------------|| 2015-01-02 | 1 | 0 | 50 | -50 | 0 ||----------------------------------- ---+-----------------------------+------------|| 2015-01-02 | 2 | 20 | 0 | 20 | 27 ||----------------------------------- ---+-----------------------------+------------|| 2015-01-02 | 3 | 0 | 0 | 0 | 0 ||----------------------------------- ---+-----------------------+------------|

Hvis du kan bruge vinduesfunktioner (som er mere effektive), kan du gøre følgende:

SELECT month, marketid, totalsold, totalshipped, lefttoship_thismonth, (sum(lefttoship_thismonth) OVER (OPDELING EFTER marketid ORDER BY month ROWS UNBOUNDED PRECEDING) ) AS total_leftFROM t t1ORDER BY month, marketid; 

Hvis din måned kolonne er en varchar (ikke en god idé), du kan caste den til dato eller bruge to_date fungere.



  1. SQL-transponer fuld tabel

  2. Forespørgselsoptimering:max() i underforespørgsel

  3. Opret tabel DDL med Execute Immediate i Oracle Database del 2

  4. Adjacency List Model vs Nested Set Model for MySQL hierarkiske data?