sql >> Databasteknik >  >> RDS >> PostgreSQL

Fyll i saknade rader när du aggregerar över flera fält i Postgres

Du kan använda:

WITH cte AS (
   SELECT date, s.product
   FROM  ... -- some way to generate date series
   CROSS JOIN (SELECT DISTINCT product FROM sales_data) s
)
SELECT 
    c.date,
    c.product,
    COUNT(sd.sale_id) AS sales
FROM cte c
LEFT JOIN sales_data sd
  ON c.date = sd.date AND c.product= sd.product
GROUP BY c.date, c.product
ORDER BY c.date, c.product;

Skapa först en kartesisk produkt av datum och produkter, sedan LEFT JOIN till faktiska data och göra beräkningar.

Oracle har en fantastisk funktion för dessa scenarier som heter Partitionerade yttre sammanfogningar :

SELECT times.time_id, product, quantity 
FROM inventory  PARTITION BY  (product) 
RIGHT OUTER JOIN times ON (times.time_id = inventory.time_id) 
WHERE times.time_id BETWEEN TO_DATE('01/04/01', 'DD/MM/YY') 
      AND TO_DATE('06/04/01', 'DD/MM/YY') 
ORDER BY  2,1; 


  1. Fyll rader i kolumn A med värdet för kolumn B om villkoret i kolumn A är uppfyllt

  2. Bästa sättet att lagra en många-till-många-relation i MySQL?

  3. MAKETIME() Exempel – MySQL

  4. Hur man säkert undkommer indata i php för mysql