2

我最近遇到了一个面试问题。3 个维度表(产品、商店和日期)和 1 个事实表(销售)。该问题要求提供一个 T-SQL 解决方案,该解决方案将返回过去一个月内每家商店每天未售出的产品数量。

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

4

3 回答 3

2

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

该表将是一行/天/产品/商店,标识特定日期在特定商店中可用的所有产品。然后,您将使用该表并从销售事实中减去已售出的产品,以获得未售出的产品。

加入 product dim 不一定有意义,因为并非所有产品都可以在所有商店出售。这可能只是一个问题,看看您是否可以构建必要的 SQL,但我认为总的来说这是一个糟糕的问题。

于 2012-12-11T14:46:28.100 回答
1

试试这个:

  1. 交叉连接产品、商店和日期,然后过滤过去一个月
  2. 反连接 (1) 到事实表,预测剩余内容,并按存储和日期聚合。

任何更多的帮助,这可能对其他人不公平。

于 2012-12-11T05:28:00.537 回答
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
于 2013-02-13T00:50:08.590 回答