2013-03-06 173 views
-6

我有查询,它返回有关整体销售的结果,但现在我想通过添加DATE间隔来筛选它们。SQL Server按日期筛选

编辑:fs.DateKeyDateTime数据类型

的我原来的查询:

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'但由于某些原因的结果是不正确的。我不明白为什么。任何提示或建议如何实现预期的效果?

谢谢!

+10

首先,什么数据类型是'fs.DateKey' ?,你的意思是不正确的结果? – Lamak 2013-03-06 18:30:35

+0

@Lamak您的评论的第二部分缺少“其次” – Kermit 2013-03-06 18:34:57

+1

为什么你有一个正确的加入? – 2013-03-06 18:36:11

回答

11

张贴作为一个答案,因为我有意见颇多:

RIGHT JOIN肯定是错误的。这意味着某些商店不需要存在,但是当然,您的销售情况与INNER JOIN的商店有关。无论如何,它有效地变成了INNER JOIN,所以不太可能成为你的问题的根源。

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

无论如何,在一个简单的明星模型中,您通常只能看到INNER JOIN s,有时看到LEFT JOINs

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

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

+4

对不起,继续迂腐,但是'BETWEEN'是'> =和<=' not '> =和<'的语法糖。 – 2013-03-06 18:55:23

+0

来详细说明,如果'end_date'是'2007-01-25',则执行'dt <'20070126''(假设'YYYYMMDD'因为实际上并不是26个月)。 – swasheck 2013-03-06 18:58:18

+0

感谢大家如何发布评论和提示。特别为'RIGHT JOIN'。我想我只是感到困惑,看起来像我的查询产生正确的结果,我的期望是错误的。抱歉,我迷惑了你。 – 2013-03-06 19:08:16