2016-08-18 1 views
0

내가 해결하려고하는 원래의 문제는 특정 "조인 된"테이블의 모든 행을 표시해야한다는 것입니다. 그러나 이들은 때때로 합계가없는 빈 칸이며 보통 표시되지 않습니다 (각각에 대한 카테고리 및 개수를 생각하십시오).첫 번째 테이블에서 값을 제외하는 조합

그래서 내가하려는 것은 모든 범주를 표시하도록 설정된 "0 값"데이터에 대한 결합입니다. 그러나 내가 노조를 할 때 그것은 0 값 행과 일반 데이터를 보여줍니다.

category_name | value 
---------------------- 
open file  | 0 
open file  | 23 
closed file | 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 

이 나에게이와 비슷한 결과 세트를 제공합니다 .. 예입니다? 실제 쿼리에는 복잡한 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

한 가지 방법으로 그룹을 중복 제거 쿼리를 감싸고 할 아래 할 수있는 선택하는 것입니다 ..하지 않는다 카테고리 테이블의 모든 카테고리 및 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를 사용하여, 그것을 이런 식으로 뭔가를 할 수 편집 가입 - 어떤 파일이있는 경우 이렇게 카테고리 테이블에서 모든 범주에 관계없이, 반환 그것 :

+0

예를 들어 중요하게 여겨지는지는 확실하지 않지만 쿼리가 크고 복잡하므로 다시 작성하지 않아도됩니다. 예 : 파일 선택 범주를 결합하십시오. 또한이 쿼리에서 실행되는 여러 합계/평균/개수가 있습니다. 여전히 제안 된 수정 프로그램을 사용할 것이라고 생각하십니까? – Sh4d0wsPlyr

관련 문제