2012-12-11 73 views
2

我有一個面試問題我最近有掙扎過。 3維表(產品,商店和日期)和1個事實表(銷售)。問了T-SQL的解決方案,在過去的一個月回報的產品出售的數量,每家商店,每天的問題。計數不出售......每家商店,每天在過去的一個月

這船已經航行了......機會已經過去了,但因爲我已經花了顯著的時間嘗試備份到一個解決方案,但沒有成功,並想關閉循環。任何指導非常感謝。

回答

2

通常使用覆蓋表回答「未發生什麼」。這可能是一個「技巧」問題,看看你是否知道使用Factless Fact表來做負面分析。

該表格將是一行/每天/產品/商店,用於識別特定日期在特定商店中可用的所有產品。然後,您可以使用該表並對從銷售事實中銷售的產品進行減法,以獲得未銷售的產品。

因爲並非所有產品都可能在所有商店銷售,所以加入產品變暗並沒有任何意義。這可能只是一個問題,看你是否可以構建必要的SQL,但我認爲這是一個很糟糕的問題。

+0

是的,實際上,您會希望至少有一個具有有效日期間隔的存儲產品表來構建該部分查詢。 –

+0

謝謝您的反饋。那是我撞牆的地方。我很快就達到了我確定的產品沒有銷售的地步,爲他們創造了零排,然後統計了整個時期的數量,但是在商店和日期水平上做同樣的事情也是我的原因帖子。我認爲這可能是一個伎倆......但還不能確定如何迴應。活到老,學到老。 –

+1

@保爾,我不認爲這是一個伎倆。如果沒有覆蓋表格,問題可以回答如下:通常情況下,您希望看到覆蓋表來幫助減少結果中的噪音。代替覆蓋表,您可以使用交叉連接並限制天數的範圍來動態構建一個覆蓋表。無論採取哪種方法,您仍需要反加入賣出的東西。 –

1

試試這個:

  1. 交叉連接產品,商店和日期,然後篩選出在過去的一個月
  2. 抗加入(1)事實表,什麼項目依然存在,並且總的存儲和日期。

更多的幫助,這可能是對他人不公平。

+0

謝謝你...我會試試看。只是重申一下,對我而言,有效答覆的窗口絕對是封閉的。不想繞過或歪曲任何迴應作爲我自己的。 –

+0

編輯你的問題,說清楚。 –

0

在查詢

--Tables

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