在线卖家的数据库模型:
要创建数据仓库,我按http://bit.ly/1bOuOXQ
展平表格
注意事实表中的数据变得重复(买家在他们的订单中购买两件商品。)
为了得到所有收入的总和,我通常会写这样的SQL:
从OrderFact
中选择sum(OrderTotal)
sql可以在原始OLTP表上正常工作,但现在我正在查询具有非规范化数据的OLAP数据仓库,现在该类型的sql将产生不正确的结果。
总收入查询应返回$ 152.60。
如何修复sql以正确查询事实表?
答案 0 :(得分:4)
如果您无法获得与总和或订单一样基本的东西,那么您的事实表设计很差。你所谓的" OrderFact"是一个" LineItemFact"。如果它是一个"订单事实",给定的订单只会在一行。
如果这是设计为LineItemFact,那么税将在一个单独的行上,您可以这样做:
select sum(LineItemTotal)
from OrderFact
如果没有,您可以使用" LineItemNumber来枚举每个订单的行。然后你可以这样做:
select sum(OrderTotal)
from OrderFact
where LineItemNumber = 1;
使用您的结构,您可以:
select sum(OrderTotal)
from (select OrderId, max(OrderTotal) as OrderTotal
from OrderFact
group by OrderId
) o