sql >> Database >  >> RDS >> Mysql

Hoe LEFT JOIN om een ​​datumbereik te maken?

Ervan uitgaande dat u een item mist in uw overeenkomstentabel voor 2012-02, is het altijd goed om een ​​tabel te hebben met alleen datums.

CREATE TABLE dates(`date` date primary key);

DROP PROCEDURE IF EXISTS insertDates;
DELIMITER $$
CREATE PROCEDURE insertDates()
BEGIN
SET @start_date = '2010-01-01';
WHILE (@start_date <= '2010-12-31') DO
INSERT INTO dates VALUES (@start_date);
SET @start_date:=DATE_ADD(@start_date, INTERVAL 1 DAY);
END WHILE;
END $$
DELIMITER ;

CALL insertDates();

Pas het datumbereik aan uw behoeften aan.

Dan kunt u uw vraag als volgt schrijven. Ik heb het een beetje vereenvoudigd, omdat ik je variabelen of de subquery niet nodig had.

SELECT userId, DATE_FORMAT(dates.`date`, '%Y%M') AS timeUnit, 
  SUM(orderValue), 
  COUNT(orderValue),
  AVG(orderValue)
FROM 
dates LEFT JOIN
`agreements` ON dates.date = agreements.acceptDate
  WHERE userId = 4 
  AND acceptDate > '2000-00-00'
GROUP BY userId, timeUnit

UPDATE:

SELECT userId, orgQuery.timeUnit, 
  @SUM := @SUM + orgQuery.orderValue AS sum, 
  @COUNT := @COUNT + 1 AS count, 
  @AVG := @SUM / @COUNT AS avg
    FROM (
    SELECT userid, orderValue,  
      DATE_FORMAT(dates.`date`, '%Y%M') AS timeUnit
FROM dates LEFT JOIN
`agreements` ON dates.date = agreements.acceptDate
    WHERE userId = 4 
    AND acceptDate > '2000-00-00' 
   GROUP BY timeUnit
)
AS orgQuery, 
  (SELECT @COUNT := 0, @SUM := 0,@AVG :=0) 
 AS extra GROUP BY timeUnit



  1. PostgreSQL vs MySQL, een vergelijking

  2. Database maken in MySQL

  3. Master High Availability Manager (MHA) is gecrasht! Wat moet ik nu doen?

  4. MariaDB GEBRUIKER() uitgelegd