【问题标题】:SQL group by return null if one is null如果一个为空,则 SQL 分组返回空
【发布时间】:2022-01-12 08:37:48
【问题描述】:

我有删除标记列date_deleted 的订单表,其值为nulldate

order_number item_id date_deleted
111 aaa null
111 bbb null
111 ccc 2021-x-x

我有查询以通过order_number 分组选择完全删除的订单

SELECT order_number, 
       date_deleted 
FROM orders 
WHERE date_deleted IS NOT NULL 
GROUP BY order_number

它给了我这个结果

order_number date_deleted
111 2021-x-x

这表示整个订单被删除但不是。

当并非所有null 都为空时,有没有办法获得?

【问题讨论】:

  • @Akina:啊对。我没看到
  • @Akina 对不起,这不是我的实际查询(它更复杂)我只是为了问题而添加它

标签: mysql sql group-by


【解决方案1】:

您可以使用 case 表达式返回最新删除的记录,其中 所有 记录都已删除,其中任何记录为 NULL,表达式将返回 NULL

SELECT order_number, 
        CASE WHEN COUNT(*) = COUNT(date_deleted) THEN MAX(date_Deleted) END AS date_deleted
FROM orders 
GROUP BY order_number;

您可能还希望使用MIN(date_deleted) 返回最早删除的日期,但重点是,如果您按order_number 分组,则只能返回一个date_deleted,并且您必须告诉查询引擎您想要哪一个通过使用某种附加逻辑(如MINMAX)返回。

【讨论】:

    【解决方案2】:

    这只会返回完全删除的订单。

    如果您加入自身并在连接中检查 NULL 值(未删除的行/部分),而不是设置“如果部分为 NULL”,则它仅包括 date_deleted 部分中没有 NULL 值的订单(因此完全删除)。

    这也不使用 COUNT 或其他可能减慢查询速度的分组,因此应该是快速且可读的。

    SELECT 
        order_number, 
        date_deleted 
    FROM orders 
        LEFT JOIN orders openOrderParts ON openOrderParts.order_number = openOrderParts.order_number 
            AND openOrderParts.date_deleted IS NULL
    WHERE date_deleted IS NOT NULL AND openOrderParts IS NULL
    GROUP BY order_number
    

    但你必须记住,它是按订单号分组的,“date_deleted”可能包含多个值,但你只是显示一个。您可以考虑在那里使用 GROUP_CONCAT 来选择性地显示所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 2016-08-01
      • 2011-08-17
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多