从第一个表中排除值的联盟

时间:2016-08-18 15:48:11

标签: tsql sql-server-2008-r2 birt

我试图解决的原始问题是我需要显示来自特定"加入"的所有行。表。然而,这些有时是空白的,没有总数,通常也不会显示(想想每个的类别和计数)。

所以我试图做的是联合一个" 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子句,因此首选避免重复。

2 个答案:

答案 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