2016-08-18 83 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