问题描述
我试图创建一个查询,该查询列出某些项目,无论它们是否出现在数据库中。假设我有一个数据库,其中列出了水果库存,并且包含以下内容:
Fruit Amount
Apples 5
Bananas 8
Oranges 9
但是我想返回一个检查所有水果类型的结果,如果找不到它们,则返回0。
Fruit Amount
Apples 5
Apricots 0
Bananas 8
Grapes 0
Oranges 9
我正在使用sql Server 2008。
这是我在stackoverflow上遇到的第一个问题,请原谅我做错了什么。我尝试过使用“选择进入”临时表,但是在检查“是否存在”的同时也想不出如何使用选择进入。
任何帮助将不胜感激。谢谢!
解决方法
您可以枚举派生表中的可能值,然后将原始表中添加left join
,最后进行汇总和计数:
select f.fruit,count(t.fruit) amount
from (values ('Apples'),('Abricots'),('Bananas'),('Grape'),('Oranges')) as f(fruit)
left join mytable t on t.fruit = f.fruit
group by f.fruit
在现实生活中,您将拥有一个引用表,该表存储了所有可能的值,例如all_fruits
,这将避免使用values()
:
select f.fruit,count(t.fruit) amount
from all_fruits f
left join mytable t on t.fruit = f.fruit
group by f.fruit