Группировка по каждому периоду полугодия - PullRequest
3 голосов
/ 03 марта 2012

Мне нужна помощь с запросом для суммирования всех значений по месяцам, сгруппированных по периодам в 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
.....

Ответы [ 2 ]

4 голосов
/ 03 марта 2012

Это в основном делает выдержку с 1 по 15 и конец месяца. MySQL имеет хорошую простую функцию «Last_Day ()», которая возвращает последний день данного месяца

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

Цель порядка в этом примере, охватывающего год, состоит в том, чтобы обеспечить весь 2011 год до 2012 года. Впоследствии я не хочу, чтобы месяцы в альфа-порядке, в которых «февраль» появлялся бы до «января», и даже 01-15 и 16- ?? можно поменять местами порядок, поэтому я явно упорядочиваю по годам (), месяцам () и МИНИМАЛЬНЫМ дням в каждой группе ... то есть: форсируем данные с наименьшим днем ​​в группе ... то есть: 1-15 против 16 до безотносительно ...

1 голос
/ 03 марта 2012

Я думаю, что это сработает:

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 .Также я использовал DATE_SUB вместе с DATE_ADD , чтобы найти последний день месяца (из соображений отображения).

Я добавил параметр формата % Y на тот случай, если он охватывает диапазон дат, превышающий 1 год, и в этом случае вы будете иметь повторные названия месяцев.

Надеюсьэто помогает.Приветствия.

...