2013-12-09 36 views
1

我是編程新手,無法找到答案。識別事實表中的百分比

我有以下尺寸(表)和事實表:

  • 客戶:客戶編號HomeRegion
  • 地區:RegionIdRegionName
  • 數值指明MyTime:IDMyHour
  • 事實表:客戶編號RegionIdTIMEIDFactId

我必須報告:HomeRegion小時RegionNameUserPercentage

EXAMPLE

如示例所示,只有3.67%的人,其家庭區域爲一個轉會上午9點等等。

我應該創建一個相似的。

問題是獲得UserPercentage。這是我迄今爲止所做的代碼。

SELECT c.HomeRegion, mt.myhour as Time, r.RegionName as CurrentRegion, 
(SELECT COUNT(*) 
     /*number of users who move from their home 
     region to CurrentRegion at specific time*/ 
)/COUNT(c.CustomerId)*100 as UserPercentage 
FROM dbo.FactTable ft 
inner join dbo.Customer c 
    ON ft.CustomerId = c.CustomerId 
inner join dbo.myTime mt 
    ON ft.TimeId = mt.ID 
inner join dbo.Regions r 
    ON ft.RegionId = r.RegionId 
WHERE mt.myhour = '09' 
GROUP BY c.HomeRegion, mt.myhour, r.RegionName 
ORDER BY c.HomeRegion, r.RegionName 
+0

什麼問題?你是否收到錯誤,結果不正確等? – Andrew

+0

不知道在評論區寫什麼代碼 – Ulugbek

+0

好吧,不是很多,我們可以告訴你沒有噸更多的信息。基本上,你需要確定誰來識別已經切換區域的人,然後將其併入計數的案例陳述中。 – Andrew

回答

1

使用分析功能
*無需選擇或GROUPBY myHour不斷
*假設一個客戶應位於1個區一次(如果不是 - 這將是更難選擇)

select HomeRegion, CurrentRegion, 
count(*)/count(*) over() as overall_share, 
count(*)/count(*) over (partition by HomeRegion) as homeregion_share, 
    from 
    (SELECT c.HomeRegion, r.RegionName as CurrentRegion, c.CustomerId as CUST 
    FROM dbo.FactTable ft 
    inner join dbo.Customer c 
     ON ft.CustomerId = c.CustomerId 
    inner join dbo.myTime mt 
     ON ft.TimeId = mt.ID 
    inner join dbo.Regions r 
     ON ft.RegionId = r.RegionId 
    WHERE mt.myhour = '09' 
    GROUP BY c.HomeRegion, r.RegionName, c.CustomerId) uni_users 
    GROUP by HomeRegion, CurrentRegion 
+0

我有這個錯誤:列'uni_users.CustomerId'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – Ulugbek

+0

請幫助!!! – Ulugbek

+0

剛剛在回答中編輯了查詢,請嘗試此操作 – Shooorf

1

在您的評論區嘗試這樣的內容。

SELECT (TMP1.Count*100)/COUNT(TMP2.CustomerId) AS 'Percentage' 
FROM 
(
SELECT COUNT(*) AS 'Count' 
FROM dbo.FactTable ft 
inner join dbo.Customer c ON ft.CustomerId = c.CustomerId 
inner join dbo.Regions r ON ft.RegionId = r.RegionId 
WHERE 
r.RegionName IN ('A','B','C','D','E') AND 
c.HomeRegion IN ('A','B','C','D','E') 
) AS 'TMP1', dbo.Customer AS 'TMP2' 
+0

應該使用哪個表來代替TABLE_NAME – Ulugbek

+0

使用具有CURRENT REGION,HOME REGION的表格。如果這些字段來自不同的表格,您也可以在此處使用連接。 – Aditya

+0

是的,它們在開始時顯示在不同的表中,但不可能僅連接這些表,我們需要先將它們連接到事實表。但結果是零(0)。 – Ulugbek