sql >> データベース >  >> RDS >> Mysql

日付範囲を作成するために、左に参加するにはどうすればよいですか?

    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. mysqlクエリを15分間隔でグループ化する

    2. JDBCドライバーはLOADDATAINFILE sqlコマンドをサポートしていますか?

    3. codeigniterを使用して各カテゴリの降順で3つのレコードを取得する

    4. PostgreSQLの「エラー:各INTERSECTクエリには同じ数の列が必要」を修正しました