3

私は次のようなテーブルを持っています

expires    | value  
-------------------
2011-06-15 | 15  
2011-06-15 | 15  
2011-06-25 | 15  
2011-07-15 | 15  
2011-07-15 | 15  
2011-07-25 | 15  
2011-08-15 | 15  
2011-08-15 | 15  
2011-08-25 | 15

吐き出すクエリを実行したい

June   | 45  
July   | 45  
August | 45  

だから私のクエリは

  SELECT SUM(amount) AS `amount`, 
         DATE_FORMAT(expires , '%M') AS `month`  
    FROM dealDollars 
   WHERE DATE(expires) BETWEEN DATE(NOW()) 
                           AND LAST_DAY(DATE(NOW()+INTERVAL 3 MONTH)) 
GROUP BY MONTH(expires)

これは問題なく動作します。しかし、その結果、たとえば7月に行がない場合、7月は表示されません。

7月に値として0を表示させるにはどうすればよいですか?

4

4 に答える 4

4

これを行う簡単な方法はありません。考えられる方法の1つは、monthsというテーブルを作成することです。このテーブルには12行が含まれます:(1月、2月、...、12月)

目的の出力を取得するために必要なクエリを使用して、Monthsテーブルを左結合できます。

于 2011-06-15T03:36:04.587 に答える
1

一般的なコンセンサスは、月の名前のテーブルを作成するだけでよいというものです。以下は、回避策として役立つことができるばかげた解決策です。

詳細については自分で作業する必要がありますが、from句のサブクエリを確認しましたか?

基本的には、次のようになります。

SELECT NVL(B.amount, 0) as `amount`, A.month as `month`
      FROM (SELECT 'January' as `month`
            UNION SELECT 'February' as `month`
            UNION SELECT 'March' as `month`...
            UNION SELECT 'DECEMBER' as `month`) as A
      LEFT JOIN
            (SELECT SUM(amount) AS `amount`, 
                    DATE_FORMAT(expires , '%M') AS `month`  
               FROM dealDollars 
               WHERE 
                  DATE(expires) BETWEEN 
                       DATE(NOW()) AND 
                       LAST_DAY(DATE(NOW()+INTERVAL 3 MONTH)) 
               GROUP BY MONTH(expires)) as B
            ON (A.MONTH = B.MONTH)

クレイジー、違いますか?

于 2011-06-15T03:47:36.770 に答える
1

MySQLには再帰機能がないため、NUMBERSテーブルトリックを使用する必要があります-

  1. 増分数のみを保持するテーブルを作成します-auto_incrementを使用して簡単に実行できます。

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. 以下を使用してテーブルにデータを入力します。

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...必要な数の値に対して。この場合、INSERTステートメントは少なくとも3回実行する必要があります。

  3. DATE_ADDを使用して、NUMBERS.id値に基づいて増加する日のリストを作成します。

    SELECT x.dt
      FROM (SELECT DATE(DATE_SUB(CURRENT_DATE(), INTERVAL (n.id - 1) MONTH)) AS dt
              FROM numbers n
             WHERE DATE(DATE_SUB(CURRENT_DATE(), INTERVAL (n.id - 1) MONTH)) BETWEEN CURRENT_DATE()
                                                                                 AND LAST_DAY(CURRENT_DATE() +INTERVAL 3 MONTH))  ) x
    
  4. OUTER JOINを使用して、目的の出力を取得します。

       SELECT x.dt,
              COUNT(*) AS total
         FROM (SELECT DATE(DATE_SUB(CURRENT_DATE(), INTERVAL (n.id - 1) MONTH)) AS dt
              FROM numbers n
             WHERE DATE(DATE_SUB(CURRENT_DATE(), INTERVAL (n.id - 1) MONTH)) BETWEEN CURRENT_DATE()
                                                                                 AND LAST_DAY(CURRENT_DATE() +INTERVAL 3 MONTH))  ) x
    LEFT JOIN YOUR_TABLE y ON y.date = x.dt
     GROUP BY x.dt
     ORDER BY x.dt
    

なぜ日付ではなく数字なのか?

単純-私が提供した例のように、日付は数値に基づいて生成できます。また、データ型ごとに1つと言うのではなく、単一のテーブルを使用することも意味します。

于 2011-06-15T05:02:10.047 に答える
0
select MONTHNAME(expires) as month_name,sum(`value`) from Table1
group by month_name order by null;

フィドル

于 2013-07-29T05:25:03.737 に答える