2013-07-08 4 views
4

Ok ... 저는 SQL에서 어떤 이유로 LEFT JOINS와 항상 투쟁합니다. SQL 쿼리 LEFT JOIN

나는 내가 기대하고있어 OpenedToday (0 값 포함) 얼마나 많은 경우의 수와, 모든 PRODUCT_CODE의 목록입니다

SELECT COUNT(*) as OpenedToday, c.Product_Line, c.Product_Code 
FROM SFCase as c 
LEFT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p ON p.Product_Code = c.Product_Code 
WHERE IsClosed = 'false' 
AND DATEPART(YEAR, GETDATE()) = DATEPART(YEAR, CreatedDate) 
AND DATEPART(MONTH, GETDATE()) = DATEPART(MONTH, CreatedDate) 
AND DATEPART(DAY, GETDATE()) = DATEPART(DAY, CreatedDate) 
GROUP BY c.Product_Line, c.Product_Code 

간단한 쿼리를 가지고있다. 대신, 나는 오늘 열린 사례가있는 제품 코드 목록 만 얻습니다 (양수 값만).

DISTINCT Product_Code 만 실행하면 70 개의 결과가 표시됩니다. 그러나 전체 쿼리를 실행하면 오늘은 4 회로 만 얻습니다. 오늘 열리는 사건이 없는지와 함께 모든 70 개의 결과를 제로와 함께보고 싶습니다.

이 조인을 잘못 했습니까?

찰리

+1

합니까 SFCase 만 건을 보유 오늘 오픈? 그렇지 않은 경우, 오늘 열린 사례가 어떤 것인지 어떻게 알 수 있습니까? 예 : open_date가 있습니까? 모든 제품을 보관할 별도의 테이블이 있습니까? –

+0

당신이하고있는 것은 정반대입니다. 오른쪽 외부 조인을 사용하십시오. – chetan

+0

Mark - 실제로, 내 실제 질의는 조금 더 있습니다 ... 나는 포럼을 위해 단순화하려고했습니다. 전체 쿼리를 표시하는 질문을 업데이트했습니다 ... 오늘 열렸는지 여부를 알기 위해 CreatedDate 필드를 확인하고 있습니다. – Charlie74

답변

2

시도 :

SELECT SUM(CASE WHEN IsClosed='false' AND DATEDIFF(DAY, GETDATE(), CreatedDate)=0 
       THEN 1 ELSE 0 END) as OpenedToday, 
     Product_Line, Product_Code 
FROM SFCase 
GROUP BY Product_Line, Product_Code 
+0

니스, 고마워. 그건 속임수 야. 그걸 이해하기 위해 잠시 시간이 걸릴 것입니다 ... 제가 시도했던 것과는 확실히 다른 접근법입니다. 그러나 그것은 제가 찾고있는 것을 정확하게 보여줄 것 같습니다. 많이 감사합니다! – Charlie74

+0

좋아요 ... 그 CASE 문을 통해 읽은 후에 ... 이것은 완벽한 의미입니다. 나는이 접근법을 좋아한다. 사실 내가 상속 한 것을 관리하려고하는 다른 쿼리를 사용하면 도움이 될 것이라고 생각한다. 나는 그들을 실제로 관리 할 수 ​​있도록 그들을 단순화 할 수 있을지도 모른다. – Charlie74

+0

@ Charlie74 : 기꺼이 도와 드릴 수 있습니다. –

1
SELECT p.Product_Line, p.Product_Code,COUNT(*) as OpenedToday 
FROM SFCase as c 
RIGHT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p 
ON p.Product_Code = c.Product_Code 
GROUP BY p.Product_Line, p.Product_Code 
+0

불행히도, 이것은 내가 가진 것과 같은 결과를 제공했습니다. – Charlie74