2016-10-13 4 views
0

아래 쿼리는 5 개의 대시 보드에 대한 레코드를 표시합니다. 쿼리가 제대로 작동합니다. 그러나 데이터가있는 대시 보드 만 표시합니다. 내가 원하는 것은 데이터가 존재하지 않는 모든 대시 보드와 열을 표시해야하며 0 또는 NULL을 표시해야합니다.데이터가없는 행의 경우 0 표시

Select 
b.[path], 
count(*) as "No of Calls", 
a.TimeDataRetrieval as "DB Retrieval time", 
a.TimeProcessing as "Processing time", 
a.TimeRendering as "Rendering Time" 

FROM LogStorage a inner join Catalog b on a.[ReportID] = b.[ItemID] 

where b.[path] IN ('Dashboard1','Dashboard2','Dashboard3','Dashboard4','Dashboard5') 
group by b.[path] 

감사합니다.

+2

'INNER JOIN'은 공유 레코드 만 표시합니다. 적용 가능한 경우 하나의 테이블과 공유 레코드에서 모두를 표시하려면 'LEFT JOIN'을 수행 할 수 있습니다. – Santi

+0

나는 그것을 시험해 보았다. 그러나 그것은 여전히 ​​모든 대시 보드를 보여주지 않을 것입니다. 내가 원하는 것은 항상 5 개의 대시 보드를 모두 표시하는 것입니다. 즉, 해당 대시 보드의 경우 데이터가없는 경우 0을 표시해야합니다. 즉, b. [경로] 열에는 항상 Dashboards1 대 Dashboard5가 표시되어야합니다. – Jatin

+1

모든 대시 보드를 선택하려면 'SELECT'가 해당 테이블을 대상으로해야하며 조건 정보가있는 테이블에서 'LEFT JOIN'을 선택해야합니다. 당신의 경우에, 나는 당신이'RIGHT JOIN'을 할 수 있다고 믿습니다. – Santi

답변

1

중요한 부분은이 관계없이 가입 유형, LogStorage 및 카탈로그에 존재하는 레코드 만에 결과 집합을 제한하고

FROM LogStorage a inner join Catalog b on a.[ReportID] = b.[ItemID] 
where b.[path] IN ('Dashboard1','Dashboard2','Dashboard3','Dashboard4','Dashboard5') 

.

당신은 주변이 뒤집어 사용하려면 왼쪽 조인 또한

SELECT b.[path] 
, SUM (CASE WHEN a.some_column IS NULL THEN 0 ELSE 1 END) as "No of Calls" 
, a.TimeDataRetrieval as "DB Retrieval time" 
, a.TimeProcessing as "Processing time" 
, a.TimeRendering as "Rendering Time" 
FROM Catalog b 
LEFT JOIN LogStorage a on b.[ItemID] = a.[ReportID] 
WHERE b.[path] IN ('Dashboard1','Dashboard2','Dashboard3','Dashboard4','Dashboard5') 
group by b.[path] 
, a.TimeDataRetrieval 
, a.TimeProcessing 
, a.TimeRendering 

, 어떤 테이블이 기록을 계산됩니다? LogStorage를 추측해야한다고해도 다소 모호합니다. 이 경우, 다른 LogStorage 열을 집계하는 것이 좋습니다. 집계가 없으면 결과는 행이되고 계수는 각 행마다 1이됩니다.

편집 : 누적 값이 이처럼 집합과 함께 제거되기 때문에 COUNT는 SUM CASE 표현식 일 필요가 있습니다.

+0

고마워요! 이것은 효과가 있었다. – Jatin

관련 문제