SQL Server按日期过滤

时间:2013-03-06 18:29:25

标签: sql sql-server sql-server-2008

我有查询返回有关整体销售的结果,但现在我想通过添加DATE区间来过滤它们。

编辑:fs.DateKey属于DateTime数据类型

我的原始查询:

SELECT s.storekey, 
       e.employeekey, 
       e.parentemployeekey, 
       pc.productcategorykey, 
       pc.productcategoryname, 
       Sum(fs.salesamount)AS SalesAmount 
FROM   dimstore s 
       INNER JOIN factsales fs 
               ON fs.storekey = s.storekey 
       RIGHT JOIN dimemployee e 
               ON e.employeekey = s.storemanager 
       INNER JOIN dimproduct p 
               ON p.productkey = fs.productkey 
       INNER JOIN dimproductsubcategory psc 
               ON psc.productsubcategorykey = p.productsubcategorykey 
       INNER JOIN dimproductcategory pc 
               ON pc.productcategorykey = psc.productcategorykey 
GROUP  BY s.storekey, 
          e.employeekey, 
          e.parentemployeekey, 
          pc.productcategoryname, 
          pc.productcategorykey 
ORDER  BY employeekey 

我在考虑添加WHERE fs.DateKey BETWEEN '2007-01-20' AND '2007-01-25',但由于某种原因,结果不正确。我不明白为什么。有关如何达到预期效果的任何提示或建议?

谢谢!

1 个答案:

答案 0 :(得分:11)

发帖作为答案,因为我有很多评论:

RIGHT JOIN肯定是错的。这意味着某些商店不需要存在,但当然,您的销售事实与INNER JOIN的商店相关联。无论如何,它实际上已变成INNER JOIN,因此不太可能成为您问题的根源。

您使用RIGHT JOIN的事实告诉我您认为可能存在外键在某些事实或维度中是可选的情况。我想知道为什么会这样。

在任何情况下,在简单明​​星模型中,您通常只会看到INNER JOIN s,有时会看到LEFT JOINs

因为事实表位于星号的中心,所以我通常会在SELECT中首先列出,特别是如果事实表中有LEFT JOIN的话。

由于它是一个数据仓库,而且您可能拥有大量数据,我不确定您可以发布多少内容,因此我们可以了解您的期望与您获得的结果,但请注意使用{{1}包含两个端点,BETWEEN数据类型可以包含时间部分。因此,我几乎总是喜欢使用符号DATETIME。它通常没有性能差异,因为dt >= start_date AND dt < end_date基本上是BETWEEN的语法糖。