Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेट रेंज बनाने के लिए LEFT JOIN कैसे करें?

यह मानते हुए कि आप 2012-02 के लिए अपनी अनुबंध तालिका में एक प्रविष्टि को याद कर रहे हैं, एक तालिका होना हमेशा अच्छा होता है जिसमें साधारण तिथियां होती हैं।

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

दिनांक सीमा को अपनी आवश्यकताओं के अनुसार समायोजित करें।

फिर आप अपनी क्वेरी निम्न की तरह लिख सकते हैं। मैंने इसे थोड़ा सरल किया, क्योंकि मैंने देखा कि आपके चर या सबक्वायरी की कोई आवश्यकता नहीं है।

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

अद्यतन करें:

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. एमएएमपी मैसकल त्रुटि - लॉग खोलने में विफल

  2. सिद्धांत 2 क्वेरीबिल्डर एकाधिक चुनिंदा तत्व/पैरामीटर जोड़ता है?

  3. दिनांक फ़ील्ड पर विदेशी कुंजी बाधा नहीं जोड़ सकता

  4. बाईं ओर एक सीमा का उपयोग करके mysql . में शामिल हों

  5. एप्लिकेशन स्तर पर केवल-पढ़ने के लिए डीबी कनेक्शन कैसे प्रबंधित करें