2016-08-18 84 views
0

我试图解决的原始问题是我需要显示特定“连接”表中的所有行。然而,这些有时是空白的,没有总计,通常不会显示(认为每个类别和计数)。从第一个表格中排除值的联盟

所以我试图做的是结合到“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

我忘记了原来的问题 - 但有一些限制我面对,因为这是使用BIRT实施的。因此,对我来说,“正确的”答案可能反映了BIRT的这些限制。 – Sh4d0wsPlyr

回答

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 
+0

我不得不稍微修改一下(因为我的工具-BIRT--不让我在SQL-Server中做所有事情),但它似乎在工作并且帮助我不得不更改任何查询。 – Sh4d0wsPlyr

1

一种方式来删除重复,包裹查询,并做组选择来自类别表的所有类别,以及左加入文件计数(按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 

编辑 如果你想扭转查询,你可以做这样的事情,使用右外连接 - 所以从类别表中的每一类将返回,而不管是否有任何文件它:

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 
+0

我不确定它是否对您的示例很重要 - 但查询(我宁愿不必重写它,因为它很大且很复杂)反转 - 例如选择文件,加入类别,我也有多个sum/avg/count在这个查询上运行,你认为它仍然可以使用建议的修复吗? – Sh4d0wsPlyr