开发者社区 问答 正文

SQL里WHERE如何只限定某项?

我想要用“总考核毛利/天数”得到日均毛利,这里的天数需要根据最小订单日期是否在本月之前而决定,但是我的总毛利又只统计本月的。
所以导致现在的“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 `业务代表`;

展开
收起
算精通 2023-07-16 13:38:21 100 分享 版权
3 条回答
写回答
取消 提交回答
  • 要实现您所描述的需求,即根据最小订单日期是否在本月之前来决定日均毛利的计算方式,可以使用子查询来解决。

    您可以首先在子查询中获取最小订单日期,并将其作为单独的列,然后在外部查询中使用该列来进行条件判断。

    以下是修改后的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进行条件判断,判断最小订单日期是否在本月之前。根据判断结果,选择不同的计算方式来计算日均毛利。

    2023-07-17 08:43:39
    赞同 展开评论
  • 如果你想要根据最小订单日期是否在本月之前来确定天数,但同时又只统计本月的总毛利,那么你可能需要使用子查询或临时表来解决这个问题。

    以下是一种可能的解决方案:

    SELECT 
        (总考核毛利 / TIMESTAMPDIFF(DAY, 最小订单日期, CURRENT_DATE)) AS 日均毛利
    FROM
        (SELECT 
            MIN(订单日期) AS 最小订单日期,
            SUM(总毛利) AS 总考核毛利
        FROM
            表名
        WHERE
            MONTH(订单日期) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)) AS 子查询别名;
    

    上述SQL语句中使用了一个子查询来获取满足条件的数据。首先,在子查询中筛选出最小订单日期在上个月的数据,并计算总毛利。然后,在外部查询中使用TIMESTAMPDIFF函数计算从最小订单日期到当前日期的天数,并将总考核毛利除以天数得到日均毛利。

    请替换示例中的表名为你实际使用的表名,并根据具体需求进行调整。此外,确保数据库支持所使用的函数和语法。

    2023-07-16 23:07:51
    赞同 展开评论
  • 北京阿里云ACE会长

    您可以将限制最小订单日期的条件放到一个子查询中,然后使用该子查询中的结果来计算日均毛利。具体操作如下:

    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子句,使用子查询中计算的最小订单日期来限定结果集,从而得到正确的日均毛利。

    2023-07-16 13:43:06
    赞同 展开评论
问答分类:
SQL
问答标签:
问答地址: