1

我是编程新手,找不到答案。

我有以下维度(表格)和事实表:

  • 客户:CustomerId , HomeRegion
  • 区域:RegionIdRegionName
  • 我的时间:id,我的小时
  • 事实表:CustomerIdRegionIdTimeIdFactId

我必须报告为:HomeRegionHourRegionNameUserPercentage

例子

如示例所示,只有 3.67% 的家乡是A 的人会在上午 9 点搬到B,依此类推。

我应该创建一个类似的。

问题是获取用户百分比。这是我到目前为止所做的代码。

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
4

2 回答 2

1

使用分析函数
* 无需 select 或 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
于 2013-12-09T18:49:58.037 回答
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'
于 2013-12-09T18:22:43.080 回答