2015-11-02 50 views
0

的名單上有下列(簡化)表:找店家丟失至少一個項目中的項目

------------------ 
|store|item|value| 
------------------ 
| 1| 1| 4| 
| 1| 2| 3| 
| 1| 3| 0| 
| 2| 2| 2| 
| 2| 3| 1| 
| 3| 4| 2| 

我想知道哪些商店缺少從項目的列表中的任何項目,我想了解他們擁有的物品的價值。項目列表通常比以上大,但通常一次只能搜索幾個。

所以我們可以說,我想知道哪些商店缺少任何項目1或項目2。我想結果像這樣理想:

------------- 
|store| 1| 2| 
------------- 
| 2| 0| 2| 
| 3| 0| 0| 

商店1沒有返回,因爲它有兩個條目項目1和項目2,其中每個值大於0。最初我只需要存儲ID,但將這些項目作爲列中的值放入行中對於我們現在需要的東西非常有用。我開始與三個查詢union'd怪物一起工作好給商店列表(第一列)。當我考慮如何添加其他列時,我決定查看是否可以簡化查詢。我想出了這個:

select store 
from table t1 
where 
(select count(*) 
from (
    select store,item 
    from table t2 
    where t2.item in (1,2) and value != 0 
    group by item,store 
) t3 
where t3.store = t1.store 
) != 2 

它不表現我的第一個更長的查詢,但它並沒有給我我想要的列。這個想法是獲得每個商店的匹配唯一物品的數量,並且如果該數量與查詢的物品數量不匹配,則返回該商店,因爲它缺少列表中的至少一個物品。

任何指針或幫助如何實現預期的結果將不勝感激!

回答

1

如果你想每家商店一行,那麼你可以使用條件彙總:

select store, 
     sum(case when item = 1 then value else 0 end) as item1, 
     sum(case when item = 2 then value else 0 end) as item2 
from table 
group by store 
having least(item1, item2) = 0; 

這是假設所有的商店有任何類型的至少一個項目。

+0

這太好了,謝謝!我把最後一行改爲最少(item1,item2)= 0;這樣我可以得到至少其中一個爲零的結果,這是我在這種情況下關心的。不幸的是,查詢需要很長時間才能運行。你有任何優化技巧,或者它只是試圖爲查詢建立一個體面的索引? – Venesectrix