Mysql 需要查询以按月查找连续订单

Mysql 需要查询以按月查找连续订单,mysql,aggregate-functions,mysql-5.5,Mysql,Aggregate Functions,Mysql 5.5,我写这个问题有困难 我需要获得连续几个月发货的当前订单数量 示例:如果当前月份是11月,并且他们在7月、8月、9月、10月、11月下单,则该用户将返回5。如果他们在11月份没有下订单,订单将返回0,因为他们的连胜被打破了 我关心的表是客户,订单,和日期,,这里您根据columnname替换现在和静态日期: Here you replace now and static date as per columnname : select (case when (month(now()

我写这个问题有困难

我需要获得连续几个月发货的当前订单数量

示例:如果当前月份是11月,并且他们在7月、8月、9月、10月、11月下单,则该用户将返回5。如果他们在11月份没有下订单,订单将返回0,因为他们的连胜被打破了

我关心的表是
客户
订单
,和
日期
,这里您根据columnname替换现在和静态日期:
Here you replace now and static date as per columnname :

select (case 
       when (month(now())=11 and 
            (month('2012-02-02')>=7 and month('2012-02-02')<=11)) 
       then 5 
       else
       0 end) as 'month'
       from tablename
选择(案例) 当(月(现在())=11和
(month('2012-02-02')>=7和month('2012-02-02')使用日期表和客户表之间的交叉联接为每个客户/月份组合获取一行,然后根据订单表左联接以获取详细信息,使用group by获取计数

类似于这样,尽管您需要修改它以处理列名为保留字的情况

SELECT customer.name, month.name, COUNT(order.id)
FROM customer
CROSS JOIN date
LEFT OUTER JOIN order
ON customer.id = order.customer_id
AND MONTH(date.date) = MONTH(order.date)
WHERE date.date BETWEEN startofdaterange AND endofdaterange
GROUP BY customer.name, month.name
或者,如果我误读了这个问题,并且如果他们每月都在这个范围内订购,您需要一个订单计数,或者如果他们跳过了一个月,您需要0个订单计数,那么类似的东西(未测试,所以除了输入错别字或2,需要测试表def):-

如果您想要每月的客户列表和以逗号分隔的订单列表:-

SELECT CustName, GROUP_CONCAT(CAST(MonthsOrder AS CHAR))
FROM (
SELECT customer.name AS CustName, month.name, COUNT(order.id) AS MonthsOrder
FROM customer
CROSS JOIN date
LEFT OUTER JOIN order
ON customer.id = order.customer_id
AND MONTH(date.date) = MONTH(order.date)
WHERE date.date BETWEEN startofdaterange AND endofdaterange
GROUP BY customer.name, month.name) Sub1
GROUP BY CustName

您可能需要扩展此项以获取每个月的名称,并强制订单

请提供表结构。这对请求的解释过于字面。这使我接近我所需要的内容,但我需要它按客户返回一行中连续订单的数量,而不是每个月/客户的一行。Customer|u id |连续订单操作。将外部组移动到Sub2的括号内。恐怕没有表defsorry我无法轻松测试它,我指的是您的第一个查询,而不是第二个查询。@Crobzilla-您的意思是您需要客户id,后跟一个逗号分隔的每月订单数量列表吗?如果是这样,我添加了另一点SQL
SELECT CustName, GROUP_CONCAT(CAST(MonthsOrder AS CHAR))
FROM (
SELECT customer.name AS CustName, month.name, COUNT(order.id) AS MonthsOrder
FROM customer
CROSS JOIN date
LEFT OUTER JOIN order
ON customer.id = order.customer_id
AND MONTH(date.date) = MONTH(order.date)
WHERE date.date BETWEEN startofdaterange AND endofdaterange
GROUP BY customer.name, month.name) Sub1
GROUP BY CustName