【问题标题】:Case When Evaluation Order评估订单时的案例
【发布时间】:2014-09-15 07:56:41
【问题描述】:

我在 SQL 中有一个带有多个条件的 Case When 语句,我需要以正确的顺序评估这些条件。 这是我的代码。

SELECT company_id, 
MIN(CASE WHEN number_of_orders >= 10 THEN order_month 
WHEN number_of_orders >= 1 AND number_of_orders < 10 THEN order_month 
ELSE NULL END) AS first_month_with_many_orders 
FROM monthly_orders

我需要先评估 number_of_orders >=10 的第一个条件。这段代码似乎没有实现这一点,因为我有一些公司的月份满足这两个条件,所以它返回满足第一个条件的最小月份。但是,我真正想要的是 >=10 个订单的最小月份,我只希望第二个条件适用于没有月份超过 10 个订单的公司。

那么我怎样才能让第一个条件被评估,然后只有在它失败时才继续第二个条件呢?

【问题讨论】:

  • 这是关于 SQL-Server 还是其他 DBMS?
  • 您的两个条件都返回order_monthTHEN 子句)。
  • 你能输入一些虚拟数据并告诉我们什么是正确的输出吗?

标签: sql if-statement case-when


【解决方案1】:

首先,您的 SQL 案例在 number_of_orders &gt;= 10number_of_orders &gt;= 1 AND number_of_orders &lt; 10 两种情况下都返回 order_month。这可能是错误的,不确定。

其次,我推荐一个子查询,像这样:

SELECT company_id, MIN(theSubquery.month_with_many_orders) as first_month_with_many_orders
FROM (
  SELECT company_id, 
         CASE WHEN number_of_orders >= 10 THEN order_month 
              WHEN number_of_orders >= 1 AND number_of_orders < 10 THEN order_month 
         ELSE NULL END) AS month_with_many_orders
) AS theSubquery

由于未提供更多信息,因此我不确定正确的详细信息。但通常情况下,我会通过子查询使步骤变得更清晰。您甚至可以摆脱 CASE 并在子查询中使用 WHERE,这将更具可读性。

【讨论】:

    【解决方案2】:

    试图得到你写的东西:

    • 如果公司至少有一个月有 10 个或更多订单,则您需要发生这种情况的第一个月
    • 如果任何月份的第一个条件都不成立,则您希望第一个月至少有 1 个订单
    • 否则,您希望那些没有订单的公司为空值

    如果我是对的,SQL 应该是:

    SELECT 
         company_id, 
         IsNull((SELECT MIN(order_month) FROM monthly_orders WHERE company_id = A.company_id and number_of_order >= 10),(SELECT MIN(order_month) FROM monthly_orders WHERE company_id = A.company_id and number_of_order >= 1 and number_of_order < 10))
    FROM monthly_orders A
    GROUP BY company_id
    

    SQL Fiddle

    更新

    另一个查询是

     SELECT 
        A.company_id,
        min(case when MAX_ORDER = 0 then NULL ELSE order_month END) first_month_with_many_orders 
     FROM monthly_orders A
     INNER JOIN (SELECT company_id, MAX(number_of_order) MAX_ORDER FROM monthly_orders GROUP BY company_id) as B
         ON A.company_id = B.company_id
         AND number_of_order >= (CASE WHEN MAX_ORDER >= 10 THEN 10 WHEN MAX_ORDER >=1 THEN 1 ELSE 0 END)
     GROUP BY A.company_id
    

    SQL Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2013-05-28
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多