0

我有包含外贸数据(货物进出口)的事实表,我有 2 列,分别命名为:coutryFrom 和 countryTo,coutryFrom 是货物运往的国家,countryTo 是货物的目的地。

有时我需要知道每个国家的出口总值以选择前 5 个目的地,有时我需要相同的结果,但要通过 coutryFrom 进口。

如您所知,预定义的国家/地区列表,例如法国、意大利、英国、美国……

我不知道我是应该在事实表中添加这两个国家还是只添加国家并做一些事情来解决这个问题

谢谢

4

1 回答 1

3

不要将国家名称直接添加到事实表中,而是使用代理键制作DIM_COUNTRY维度表,并将DIM_COUNRTY_ID代理键放入事实表中。然后,您可以在查询中为该表设置别名,以便它可以连接到和。COUNTRY_FROM_IDCOUNTRY_TO_IDDIM_COUNTRYCOUNTRY_FROM_IDCOUNTRY_TO_ID

前 5 个国家来自:

SELECT *
FROM 
(
  SELECT 
    RANK() OVER(ORDER BY F.AMOUNT) RANK
  , CF.COUNTRY_NAME
  , SUM(F.AMOUNT)
  FROM
    FACT_EXPORTS F
  , DIM_COUNTRY CT
  , DIM_COUNTRY CF
  WHERE 0=0
    AND F.COUNTRY_TO_ID   = CT.DIM_COUNTRY_ID
    AND F.COUNTRY_FROM_ID = CF.DIM_COUNTRY_ID
  GROUP BY
    CT.COUNTRY_NAME          
)
WHERE 
  RANK <= 5
ORDER BY 
  RANK
; 

前 5 个国家/地区

SELECT *
FROM 
(
  SELECT 
    RANK() OVER(ORDER BY F.AMOUNT) RANK
  , CT.COUNTRY_NAME
  , SUM(F.AMOUNT)
  FROM
    FACT_EXPORTS F
  , DIM_COUNTRY CT
  , DIM_COUNTRY CF
  WHERE 0=0
    AND F.COUNTRY_TO_ID   = CT.DIM_COUNTRY_ID
    AND F.COUNTRY_FROM_ID = CF.DIM_COUNTRY_ID
  GROUP BY
    CT.COUNTRY_NAME          
)
WHERE 
  RANK <= 5
ORDER BY 
  RANK
; 

请注意,如果出现平局,这两个查询都将返回超过 5 条记录。最后一个考虑因素是您是否希望为始发国和目的地国保留不同的描述性属性。然后你需要 2 个单独的维度 DIM_COUNTRY_FROM 和 DIM_COUNTRY_TO。无论哪种方式,您仍然会使用代理键而不是将国家/地区名称放入事实表中。

于 2013-06-14T17:34:04.623 回答