[英]Group-By for every half month date range
我需要一個查詢幫助,按月分組所有按月分組的值。
試:
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
.....
這基本上是從1月15日和16日末分解的提取物。 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
在這個示例中,跨越一年的訂單的目的是確保2012年之前的所有2011年。隨后,我不希望在“Jan”之前出現“Feb”的alpha順序的月份,甚至是01-15和16- ?? 可以換成順序,所以我明確地按每個組內的年(),月()和最小日排序...即:強制組內最低日數據...即:1-15 vs 16 to隨你...
我認為這將完成這項工作:
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
value corresponds to. 這里發生的是我使用DATEDIFF查找自月初以來的天數,從而找到值對應的月份的哪一半。 我還使用DATE_SUB和DATE_ADD來查找該月的最后一天(出於顯示原因)。
我添加了%Y格式參數,以防日期范圍超過1年,在這種情況下,您將重復使用月份名稱。
希望能幫助到你。 干杯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.