我有查询返回有关整体销售的结果,但现在我想通过添加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'
,但由于某种原因,结果不正确。我不明白为什么。有关如何达到预期效果的任何提示或建议?
谢谢!
答案 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
的语法糖。