2012-03-02 18 views
3

15日のグループ別に月ごとにすべての値を合計するクエリが必要です。グループバイバイの月ごとの日付範囲

しよう:

SELECT sum(price) From table WHERE ADD_DATE(date, INTERVAL 15 DAY); 

期待される結果:

Jan Day 1 - 15 = 5.2 
Jan Day 16 - 31 = 80.4 

Feb Day 1 - 15 = 50 
Feb Day 16 - 28 = 80.2 
..... 
+0

いつも明示的に15日間ですか?そして、どのくらいの期間、あなたが望むのですか...範囲、年?異なるグループ分けの間隔が変わるでしょうか? – DRapp

+0

いつも15日!!!期間の範囲の年、変更グループなし – Igor

+2

1月16-31日は16日ですか?そして2月16-28日は13日間ですか? – ruakh

答えて

1

を、私はこれが仕事をすると思う:

SELECT SUM(price) AS price_sum, month_half FROM 
(
    SELECT price, 
    IF(
    DATEDIFF(`date`, DATE_FORMAT(`date`, "%Y-%m-01")) > 15, 
    CONCAT(
     DATE_FORMAT(`date`, "%b %Y Day 16 - "), 
     DATE_FORMAT(
     DATE_SUB(
     DATE_ADD(DATE_FORMAT(`date`, "%Y-%m-01"), INTERVAL 1 MONTH), 
     INTERVAL 1 DAY), "%d" 
    ) 
    ), 
    DATE_FORMAT(`date`, "%b %Y Day 1 - 15") 
    ) AS month_half, 
    `date` AS order_date 
    FROM table WHERE 
    `date` >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) 
) AS t 
GROUP BY month_half ORDER BY order_date 

何ここで起こることは、私が見つけることDATEDIFFを使用することです月の初めからの日数であるから、月はの日付の値に相当します。 また、DATE_SUBDATE_ADDを使用して、月の最終日を見つけました(表示上の理由から)。

%Y形式パラメータは、1年を超える日付範囲に渡る場合に追加されます。この場合、月名が繰り返されます。

希望します。乾杯。

4

これは、基本的に、月の1-15と16-末で抽出されます。 MySQLは

select 
     CONCAT(DATE_FORMAT(`date`, '%b %Y Day '), 
      case when dayofmonth(`date`) < 16 
       then '01-15' 
       else CONCAT('16-', right(last_day(`date`), 2) ) 
       end) as CharMonth, 
     sum(price) as TotalPrice 
    from 
     invoice 
    group by 
     CharMonth 
    order by 
     year(`date`), 
     month(`date`), 
     min(dayofmonth(`date`)) 

上記の順序の目的この中で

CharOfMonth   TotalPrice 
Dec 2011 Day 01-15 226.98 
Dec 2011 Day 16-31 108.12 
Jan 2012 Day 01-15 983.08 
Jan 2012 Day 16-31 235.02 
Feb 2012 Day 01-15 271.29 
Feb 2012 Day 16-29 382.91 
Mar 2012 Day 01-15 900.28 

の一例を示すであろう素敵な簡単な関数指定した月の最後の日を返す「LAST_DAY()」を持っています1年に渡る例は2012年前の2011年をすべて保証することです。その後、「月」が「Jan」の前に表示され、さらに01〜15および16-私は明示的に各グループ内のyear()、month()、MINIMUM dayで順序付けしています。つまり、グループ内の一番低い日のデータを強制的に...つまり:1-15対16何でも...