我需要一个查询帮助,按月分组所有按月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 :(得分:4)
这基本上是从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无论...
答案 1 :(得分: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 值对应的月份的哪一半至。 我还使用 DATE_SUB 和 DATE_ADD 来查找当月的最后一天(显示原因)。
我添加了%Y 格式参数,以防日期范围超过1年,在这种情况下,您将重复使用月份名称。
希望它有所帮助。欢呼声。