【问题标题】:Sum only if all grouped rows are not null, else return null仅当所有分组行不为空时求和,否则返回空
【发布时间】:2015-07-03 18:59:29
【问题描述】:

我有一张这样的桌子:

 item_id   quantity
 1         2
 1         3
 2         NULL
 2         4
 3         NULL
 3         NULL

现在我正在做这样的选择:

SELECT 
   sum(`quantity`) AS `total_quantity`,
FROM `items`
GROUP BY `item_id`

现在,它分别返回 5、4 和 NULL,但我想要 5、NULL 和 NULL。

我希望如果分组行中有 NULL 值,则总和应该为 NULL,而不是列不为空的行的总和。我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 发布您对所提供数据集的预期输出
  • 我只能实现不返回任何包含 NULL 的行。这可以接受吗?
  • @thanyaj 我已经有了,但我也需要这些行。我需要想办法知道总和中的某些行是否为 NULL。

标签: mysql


【解决方案1】:

您只能使用case 语句来检查组的任何一行是否包含null 作为数量

SELECT item_id,
     CASE WHEN SUM(quantity IS NULL) > 0 
     THEN NULL 
     ELSE SUM(quantity) 
     END quantity
FROM items
GROUP BY item_id

使用@Abhik Chakraborty 的小提琴

DEMO

【讨论】:

  • 一如既往@M Khalid Junaid 很聪明 :-)
  • 这正是我所需要的,它避免使用子查询。谢谢! :)
【解决方案2】:

如果输出很奇怪,那就太好了,在大多数情况下,请求是将 null 替换为 0 或其他内容,但是这是一种方法

select 
x.item_id,
max(x.quantity) as quantity from (
  SELECT 
  t1.item_id,
  @sm:= if(@prev_item = item_id, @sm_qty+quantity,quantity) as quantity,
  @prev_item :=item_id,
  @sm_qty:= quantity
  from items t1,(select @prev_item:=null,@sm_qty=0)x
  order by item_id
)x
group by x.item_id;

http://www.sqlfiddle.com/#!9/ccb36/13

【讨论】:

    【解决方案3】:
    SELECT * FROM (
        ( -- Get all not null quantities
            SELECT 
               `i1`.`item_id`,
               sum(`i1`.`quantity`) AS `total_quantity`
               FROM `items` AS `i1`
               WHERE `i1`.`item_id` NOT IN ( SELECT `i2`.`item_id` FROM `items` AS `i2` WHERE `i2`.`quantity` IS NULL )
            GROUP BY `item_id`
        )
        UNION ALL
        ( -- Get all null quantities
            SELECT 
               `i3`.`item_id`,
               null AS `i3`.`total_quantity`
               FROM `items` AS `i3`
               WHERE `i3`.`item_id` IN ( SELECT `i4`.`item_id` FROM `items` AS `i4` WHERE `i4`.`quantity` IS NULL )
            GROUP BY `i3.item_id`
        )
    ) AS items_table
    ORDER BY items_table.item_id
    

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2019-12-23
      • 2021-04-18
      • 2021-07-13
      • 2020-10-26
      • 2017-01-08
      相关资源
      最近更新 更多