我最近遇到了一个面试问题。3 个维度表(产品、商店和日期)和 1 个事实表(销售)。该问题要求提供一个 T-SQL 解决方案,该解决方案将返回过去一个月内每家商店每天未售出的产品数量。
那艘船已经航行了……机会已经过去了,但从那以后我花了很多时间试图回到解决方案中,但无济于事,并且想关闭循环。非常感谢任何指导。
我最近遇到了一个面试问题。3 个维度表(产品、商店和日期)和 1 个事实表(销售)。该问题要求提供一个 T-SQL 解决方案,该解决方案将返回过去一个月内每家商店每天未售出的产品数量。
那艘船已经航行了……机会已经过去了,但从那以后我花了很多时间试图回到解决方案中,但无济于事,并且想关闭循环。非常感谢任何指导。
通常使用覆盖表来回答“没有发生的事情”。这可能是一个“技巧”问题,看看您是否知道使用 Factless Fact 表进行负面分析。
该表将是一行/天/产品/商店,标识特定日期在特定商店中可用的所有产品。然后,您将使用该表并从销售事实中减去已售出的产品,以获得未售出的产品。
加入 product dim 不一定有意义,因为并非所有产品都可以在所有商店出售。这可能只是一个问题,看看您是否可以构建必要的 SQL,但我认为总的来说这是一个糟糕的问题。
试试这个:
任何更多的帮助,这可能对其他人不公平。
查询中包含的日期
--表格
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