过去一个月每个商店每天都没有销售的产品数量

时间:2012-12-11 05:02:08

标签: tsql data-warehouse

我正在努力解决我最近的面试问题。 3维表(产品,商店和日期)和1个事实表(销售)。问题是要求一个T-SQL解决方案,该解决方案将返回过去一个月每个商店每天销售的产品数量。

那艘船已经航行......机会已经过去,但我已经花了很多时间试图回到解决方案,无济于事,并希望关闭循环。非常感谢任何指导。

3 个答案:

答案 0 :(得分:2)

通常使用覆盖表来回答“未发生的事情”。这可能是一个“技巧”问题,看你是否知道使用Factless Fact表做负面分析。

此表格为一行/天/产品/商店,用于标识特定日期特定商店中可用的所有商品。然后,您可以使用该表并对从销售事实中销售的产品进行一组减法,以获得未销售的产品。

加入产品暗淡是没有意义的,因为并非所有商店都可以销售所有产品。这可能只是一个问题,看你是否可以构建必要的SQL,但我认为这是一个很糟糕的问题。

答案 1 :(得分:1)

试试这个:

  1. 交叉加入产品,商店和日期,然后过滤过去一个月
  2. 反连接(1)到事实表,预测剩余的内容,并按商店和日期汇总。
  3. 任何更多帮助,这可能对其他人不公平。

答案 2 :(得分:0)

查询中包含的日期

- 表

CREATE TABLE dimProduct(ProductID INT,ProductName VARCHAR(50))

CREATE TABLE dimStore(StoreID INT,StoreName VARCHAR(50))

CREATE TABLE dimDate(DateID INT,dimDate VARCHAR(50))

CREATE TABLE factSales(ProductID INT,StoreID INT,DateID INT)

- =最终查询

SELECT StoreID,DateID,count(ProductID) AS CountOfProductsNotSold
FROM
(
SELECT StoreID,DateID,ProductID FROM dimProduct CROSS JOIN dimStore CROSS JOIN dimDate WHERE dimDate >= '01/01/2013'
EXCEPT
SELECT StoreID,d.DateID,ProductID FROM factSales s JOIN dimDate d ON s.DateID = d.DateID WHERE dimDate >= '01/01/2013'
)T
GROUP BY StoreID,DateID