我试图解决的原始问题是我需要显示来自特定"加入"的所有行。表。然而,这些有时是空白的,没有总数,通常也不会显示(想想每个的类别和计数)。
所以我试图做的是联合一个" 0值"数据集显示所有类别。但是当我进行联合时,它会显示一个0值行,以及正常数据。这是一个例子..
SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id
UNION
SELECT category_name, 0
FROM categories
这将给我一个看起来类似于此的结果集:
category_name | value
----------------------
open file | 0
open file | 23
closed file | 0
有没有办法删除重复的零值条目?请不要在实际查询中有一个复杂的WHERE子句,因此首选避免重复。
答案 0 :(得分:1)
我不知道你为什么要离开加入和结合..
您可以在下面执行以删除重复项,打包查询并按
进行分组;with cte
as
(
SELECT category_name, COUNT(files_number)
FROM files
LEFT JOIN categories ON categories.category_id = files.category_id
UNION
SELECT category_name, 0
FROM categories
)
select categoryname,sum(aggcol)
from cte
group by
category
答案 1 :(得分:1)
一种方法是从类别表中选择所有类别,并将LEFT JOIN加到文件计数上(按category_id分组)。
SELECT c.category_name, ISNULL(fc.FileCount, 0) AS FileCount
FROM categories c
LEFT JOIN (
SELECT category_id, COUNT(files_number) AS FileCount
FROM files
GROUP BY category_id
) fc ON c.category_id = fc.category_id
修改强> 如果你想颠倒查询,你可以使用RIGHT OUTER JOIN这样做 - 所以返回类别表中的每个类别,无论是否有任何文件:
SELECT c.category_name, COUNT(f.category_id) AS FileCount
FROM files f
RIGHT JOIN categories c ON c.category_id = f.category_id
GROUP BY c.name