2011-12-28 87 views
1

您好我有一个这样的查询返回登记数据,在过去6个月,但数据只能显示应该有至少1招生,怎么能够显示其有没有招生,当数月好?我知道我可能不得不对这条线做点什么:的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 2011-12-28 08:08:21

回答

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

感谢指针,但它不能解决我显示空数据的问题。 – k80sg 2011-12-28 09:41:03