2015-11-02 121 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