2014-10-20 3 views
0

주어진 날짜 범위, 모든 이름, 날짜 및 데이터가있는 보고서 쿼리를 만들려고합니다. 나는 정말 가깝지만 데이터에서 이러한 최종 0 값을 얻는 방법을 놓치고 있습니다. 그래서 여기 내가 원하는 무엇을 :SQL Server : 두 테이블 조인은 하루에 데이터가없는 모든 행을 표시합니다.

Name ID  Mth Day Count 
Auburn 7261 10 14 0 
Auburn 7261 10 15 0 
Auburn 7261 10 16 0 
Auburn 7261 10 17 0 
Auburn 7261 10 18 0 
Concord 7262 10 14 2 
Concord 7262 10 15 0 
Concord 7262 10 15 0 
Concord 7262 10 17 1 
Katey 7263 10 14 0 
Katey 7263 10 15 0 
Katey 7263 10 16 0 
Katey 7263 10 17 0 
Katey 7263 10 18 0 

을 대신 내가 갖는 :

Name ID  Mth Day Count 
Auburn 7261 10 14 0 
Auburn 7261 10 15 0 
Auburn 7261 10 16 0 
Auburn 7261 10 17 0 
Auburn 7261 10 18 0 
Concord 7262 10 14 2 
Concord 7262 10 17 1 
Katey 7263 10 14 0 
Katey 7263 10 15 0 
Katey 7263 10 16 0 
Katey 7263 10 17 0 
Katey 7263 10 18 0 

여기 내 쿼리 :

0을이 이름에 표시되지 왜 내가 얻을
SELECT PUE.Name as [Name], pue.EventID, 
MONTH(dates.Date) AS Month, DAY(dates.Date) AS Day, 
puc.idcount AS PicturesTaken 
from (
select name, eventid from Events where 
TourID = 444 and EventID > 7256 and EventID < 7323 
) PUE 
outer apply (
SELECT 
    Date = DateAdd(Day, n1.number * 10 + n0.number, '2014-10-14') 
FROM 
    (SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) as n0 
CROSS JOIN 
    (SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) as n1 
WHERE DateAdd(Day, n1.number * 10 + n0.number, '2014-10-14') BETWEEN '2014-10-14' AND '2014-10-18' 
) dates 
left outer join (
select eventid, convert(date,picturetakendate) as picdate, count(consumerdataid) as idcount from ConsumerData 
where EventID > 7256 and EventID < 7323 
group by eventid, convert(date,picturetakendate) 
) puc 
on pue.EventID = puc.EventID 
where puc.picdate = dates.Date or puc.idcount is NULL 
order by pue.eventid, MONTH(dates.Date), DAY(dates.Date) 

, 다음은 외부 조인 결과입니다.

7262 2014-10-14 2 
7262 2014-10-17 1 
7265 2014-10-14 2 
7266 2014-10-14 2 

where 절에서 null이 아니거나 날짜와 일치한다는 것은 의미가 있습니다. 하지만 where 절을 수강하면 모든 날짜 즉마다 횟수에 대한 행을 얻을 :

Concord 7262 10 14 2 
Concord 7262 10 14 1 
Concord 7262 10 15 1 
Concord 7262 10 15 2 
Concord 7262 10 16 2 
Concord 7262 10 16 1 
Concord 7262 10 17 1 
Concord 7262 10 17 2 
Concord 7262 10 18 2 
Concord 7262 10 18 1 

내가 너무 가까이있어, 난 그냥 단지 내가 부족 간단 뭔가하지만 난에 만들어 각 시도가 알고 실제로 결과가 나 빠지게 수정합니다. 그래서 도움을 청합니다. 난 그냥 바깥 쪽 조인 어떤 식 으로든 날짜를 참조 할 수있는 모든 날짜를 표시하기 위해 쿼리를 수정하는 방법을 시들게 할 필요가있을 것 같아요. 날짜 적용이 더 쉽거나 변경 될 수 있습니다. 그러나 나는 방법을 알아낼 수 없었다.

답변

1

SELECT 절에 IT ON

on pue.EventID = puc.EventID 
AND puc.picdate = dates.Date 

대신

where puc.picdate = dates.Date or puc.idcount is NULL 
+0

에 절이었다

SELECT PUE.Name as [Name], pue.EventID, MONTH(dates.Date) AS Month, DAY(dates.Date) AS Day, ISNULL(puc.idcount,0) AS PicturesTaken 

변환을 ISNULL 조건을 추가! 정말 고마워. –

관련 문제