2015-07-03 49 views
0

我有一個表是這樣的:總和只有當所有分組的行不爲空,否則返回空

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,而不是其列不爲空的行的總和。我怎樣才能做到這一點?

謝謝!

+0

張貼提供的數據您的預計輸出設置 –

+0

我只能做到不返回包含NULL的任何行。這可以接受嗎? – thanyaj

+0

@thanyaj我已經有了,但我也需要這些線。我需要找出一種方法來了解總和中的某些行是否爲NULL。 –

回答

2

你可以僅使用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

+1

一如既往@M哈立德Junaid多數民衆贊成在智能:-) –

+1

這正是我所需要的,它避免使用子查詢。謝謝! :) –

2

那一種,如果怪異的輸出,在大多數情況下,請求是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

0
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 
相關問題