Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để THAM GIA TRÁI, để tạo Phạm vi ngày?

Giả sử bạn thiếu một mục trong bảng thỏa thuận của mình cho 2012-02, thì tốt hơn hết bạn nên có một bảng chỉ chứa ngày tháng.

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();

Điều chỉnh phạm vi ngày theo nhu cầu của bạn.

Sau đó, bạn có thể viết truy vấn của mình như sau. Tôi đã đơn giản hóa nó một chút, vì tôi không cần đến các biến hoặc truy vấn con của bạn.

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

CẬP NHẬT:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn hàng loạt MySQL từ tệp dữ liệu CSV

  2. Tại sao TRANSACTION / COMMIT lại cải thiện hiệu suất rất nhiều với PHP / MySQL (InnoDB)?

  3. Mệnh đề Mysql LIKE và các từ riêng biệt trong một trường

  4. Làm cách nào để ngăn mySQL đặt lại giá trị tăng tự động?

  5. Cách tốt nhất để mã hóa / giải mã chuỗi json là gì