MYSQL查询组按自定义月份日期?

时间:2011-12-29 01:06:37

标签: mysql group-by

我写了一个返回月度销售额的查询。

SELECT
count(O.orderid) as Number_of_Orders,
concat (MonthName(FROM_UNIXTIME(O.`date`)),' - ',year(FROM_UNIXTIME(O.date))) as     Ordered_Month,
sum(O.total) as TotalAmount,
Month(FROM_UNIXTIME(O.`date`)) as Month_of_Year,
year(FROM_UNIXTIME(O.date)) as Sale_Year
FROM orders O
group by Month_of_Year, Sale_Year
order by Sale_Year DESC,Month_of_Year DESC

我想将其设为像

这样的自定义日期

而不是第1到第1,它应该分组为每个月的10日-10。 不知道怎么这样分组!

2 个答案:

答案 0 :(得分:1)

因为你正在处理时间的“转变”,所以你必须在你的等式中进行数学计算以“假装”。像

这样的东西
SELECT
      count(O.orderid) as Number_of_Orders,
      concat(
         MonthName( Date_Sub( FROM_UNIXTIME(O.`date`), INTERVAL 10 DAY )),
         ' - ',
         Year( Date_Sub( FROM_UNIXTIME(O.date), INTERVAL 10 DAY) )
            ) as Ordered_Month,
      sum(O.total) as TotalAmount,
      Month( Date_Sub( FROM_UNIXTIME(O.`date`), INTERVAL 10 DAY )) as Month_of_Year,
      Year( Date_Sub( FROM_UNIXTIME(O.date), INTERVAL 10 DAY )) as Sale_Year
   FROM 
      orders O
   group by 
      Month_of_Year, 
      Sale_Year
   order by 
      Sale_Year DESC,
      Month_of_Year DESC

所以,从本质上讲,你正在考虑日期:3月11日至31日+ 4月1 - 10日,并从它们中减去“10天”......所以对于查询,它们看起来像3月1日到31日, 4月11日至30日将出现在4月1日至20日+ 5月等每年剩余的时间......

答案 1 :(得分:0)

未经测试。

group by Month_of_Year, ceil(day(o.`date`)/10), Sale_Year

这是一个更好的主意,以避免有4组但只有3个

select 
month(my_date) as your_month,
year(my_date) as your_year,
case 
when day(my_date) <= 10 then 1
when day(my_date) between 11 and 20 then 2
else 3 end as decade,
count(*) as total
from table
group by 
your_month,your_year,decade

根据您的需要进行调整。