我想要用“总考核毛利/天数”得到日均毛利,这里的天数需要根据最小订单日期是否在本月之前而决定,但是我的总毛利又只统计本月的。
所以导致现在的“MIN( 订单日期 )”只能被总毛利的条件限定。请问如何能让我的“MIN( 订单日期 )”突破后面“WHERE MONTH ( 订单日期 )= MONTH ( CURRENT_DATE - 1 ) ”的限制呢?
SELECT `业务代表`,
CASE WHEN MONTH (MIN( `订单日期` ))< MONTH ( CURRENT_DATE )
THEN ROUND(SUM( `考核毛利` )/ DATEDIFF(CURRENT_DATE - 1,DATE_ADD( LAST_DAY( CURRENT_DATE ), INTERVAL - 1 MONTH )))
ELSE ROUND(SUM( `考核毛利` )/ DATEDIFF(CURRENT_DATE,MIN( `订单日期` )))
END AS "本月日均"
FROM `导购销售`
WHERE MONTH ( `订单日期` )= MONTH ( CURRENT_DATE - 1 )
GROUP BY `业务代表`;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要实现您所描述的需求,即根据最小订单日期是否在本月之前来决定日均毛利的计算方式,可以使用子查询来解决。
您可以首先在子查询中获取最小订单日期,并将其作为单独的列,然后在外部查询中使用该列来进行条件判断。
以下是修改后的SQL查询示例:
SELECT `业务代表`,
CASE WHEN MONTH(min_order_date) < MONTH(CURRENT_DATE)
THEN ROUND(SUM(`考核毛利`) / DATEDIFF(CURRENT_DATE - 1, DATE_ADD(LAST_DAY(CURRENT_DATE), INTERVAL -1 MONTH)))
ELSE ROUND(SUM(`考核毛利`) / DATEDIFF(CURRENT_DATE, min_order_date))
END AS "本月日均"
FROM (
SELECT `业务代表`, MIN(`订单日期`) AS min_order_date
FROM `导购销售`
GROUP BY `业务代表`
) AS subquery
WHERE MONTH(min_order_date) = MONTH(CURRENT_DATE - 1)
GROUP BY `业务代表`;
在这个查询中,我们首先使用子查询获取每个业务代表的最小订单日期,并将其命名为min_order_date
。然后,在外部查询中,我们使用min_order_date
进行条件判断,判断最小订单日期是否在本月之前。根据判断结果,选择不同的计算方式来计算日均毛利。
如果你想要根据最小订单日期是否在本月之前来确定天数,但同时又只统计本月的总毛利,那么你可能需要使用子查询或临时表来解决这个问题。
以下是一种可能的解决方案:
SELECT
(总考核毛利 / TIMESTAMPDIFF(DAY, 最小订单日期, CURRENT_DATE)) AS 日均毛利
FROM
(SELECT
MIN(订单日期) AS 最小订单日期,
SUM(总毛利) AS 总考核毛利
FROM
表名
WHERE
MONTH(订单日期) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)) AS 子查询别名;
上述SQL语句中使用了一个子查询来获取满足条件的数据。首先,在子查询中筛选出最小订单日期在上个月的数据,并计算总毛利。然后,在外部查询中使用TIMESTAMPDIFF
函数计算从最小订单日期到当前日期的天数,并将总考核毛利除以天数得到日均毛利。
请替换示例中的表名为你实际使用的表名,并根据具体需求进行调整。此外,确保数据库支持所使用的函数和语法。
您可以将限制最小订单日期的条件放到一个子查询中,然后使用该子查询中的结果来计算日均毛利。具体操作如下:
SELECT 业务代表,
CASE
WHEN MIN_ORDER_DATE < DATE_ADD( LAST_DAY( CURRENT_DATE ), INTERVAL - 1 MONTH )
THEN ROUND(SUM( 考核毛利 )/ DATEDIFF(CURRENT_DATE - 1,DATE_ADD( LAST_DAY( CURRENT_DATE ), INTERVAL - 1 MONTH )))
ELSE ROUND(SUM( 考核毛利 )/ DATEDIFF(CURRENT_DATE,MIN_ORDER_DATE))
END AS "本月日均"
FROM (
SELECT 业务代表, MIN( 订单日期 ) AS MIN_ORDER_DATE, SUM( 考核毛利 ) AS TOTAL_PROFIT
FROM 导购销售
WHERE MONTH ( 订单日期 )= MONTH ( CURRENT_DATE - 1 )
GROUP BY 业务代表
) AS T
WHERE MONTH(MIN_ORDER_DATE) < MONTH(CURRENT_DATE)
GROUP BY 业务代表;
在上面的查询中,首先将限制最小订单日期的条件放在子查询中,使用MIN函数计算每个业务代表的最小订单日期和总毛利。然后,在主查询中,使用子查询中计算的最小订单日期和总毛利来计算日均毛利。同时,为了只限定最小订单日期的条件,我们在主查询中添加了一个WHERE子句,使用子查询中计算的最小订单日期来限定结果集,从而得到正确的日均毛利。