2011-12-28 4 views
1

안녕하세요, 지난 6 개월 동안 등록 데이터를 반환하는 이와 같은 쿼리가 있습니다. 그러나 데이터가 적어도 하나의 등록이 있어야 표시됩니다. 등록이없는 달을 어떻게 표시 할 수 있습니까? 잘? 나는 아마도이 라인에 뭔가를해야한다는 것을 알고있다 :SQL Server + null 데이터 반환

LEFT(CONVERT(varchar, issuedate, 112), 6) BETWEEN 
    LEFT(CONVERT(varchar, DATEADD(MM, -6, GETDATE()), 112), 6) AND 
    LEFT(CONVERT(varchar, GETDATE(), 112), 6) 

고마워.

SELECT 
    DateName(month,issuedate) + ' ' + CAST(Year(issuedate) as Char(4)) as IssueDate, 
    COUNT(distinct m.ID) AS SignUps 
FROM 
    Member m 
INNER JOIN 
    Card c ON m.ID = c.MemberID 
WHERE 
    m.Deletedby is null 
    AND c.Deletedby is null 
    AND LEFT(CONVERT(varchar, issuedate, 112), 6) BETWEEN 
      LEFT(CONVERT(varchar, DATEADD(MM, -6, GETDATE()), 112), 6) 
      AND LEFT(CONVERT(varchar, GETDATE(), 112), 6) 
GROUP BY 
    DateName(month, issuedate) + ' ' + CAST(Year(issuedate) AS Char(4)), CAST(CAST(YEAR(issuedate) AS VARCHAR) + '/'+ CAST(MONTH(issuedate) AS VARCHAR) +'/1' AS DateTime) 
+0

단순히 해당 조건이 당신이 원하는 것을 달성 제거하지 않을까요? – ToddBFisher

답변

2

관찰 :
1. 테이블 이름이 연결되는 방식을 의미하지는 않습니다.
2. 사용한 것과 같은 기능을 사용하면 절대로 올바른 색인을 사용하지 않습니다.
3. 모든 열 참조는 코드를 쉽게 이해할 수 있도록 테이블 별칭으로 정규화되어야합니다.
4. getdate()는 비 결정적 함수이므로 잘못된 쿼리 계획이 발생합니다. sp에 날짜를 전달하십시오.

카드 테이블의 항목이 일부 회원이 카드를 등록하는 때 생성된다고 가정 : -

SELECT 
    <month_year_string> as IssueDate, 
    COUNT(distinct c.memberid) AS SignUps 
FROM 
    Member m 
lEFT OUTER JOIN 
    Card c ON m.ID = c.MemberID  AND c.Deletedby is null 
WHERE 
    m.Deletedby is null 
    AND c.issuedate BETWEEN DATEADD(MM, -6, GETDATE()) AND GETDATE() 
GROUP BY <month_year_string> 
+0

포인터를 주셔서 감사하지만 그것은 null 데이터를 보여주는 내 문제를 해결하지 않습니다. – k80sg