如何编写SQL查询数据仓库事实表

如何编写SQL查询数据仓库事实表,sql,data-warehouse,Sql,Data Warehouse,在线卖家的数据库模型: 为了创建数据仓库,我按照 注:事实数据表中的数据变得重复,买家按订单购买两件商品 为了获得所有收入的总和,我通常会这样编写sql: 从OrderFact中选择sumOrderTotal sql可以在原始OLTP表上正常工作,但现在我查询的是一个OLAP数据仓库,它已对数据进行了非规范化处理,现在这种类型的sql将产生不正确的结果 查询总收入应返回$152.60 如何修复sql以正确查询事实表?如果无法获得像总和或顺序这样的基本数据,那么事实表的设计就很糟糕。您所谓的Ord

在线卖家的数据库模型:

为了创建数据仓库,我按照

注:事实数据表中的数据变得重复,买家按订单购买两件商品

为了获得所有收入的总和,我通常会这样编写sql:

从OrderFact中选择sumOrderTotal

sql可以在原始OLTP表上正常工作,但现在我查询的是一个OLAP数据仓库,它已对数据进行了非规范化处理,现在这种类型的sql将产生不正确的结果

查询总收入应返回$152.60


如何修复sql以正确查询事实表?

如果无法获得像总和或顺序这样的基本数据,那么事实表的设计就很糟糕。您所谓的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

如果不能得到像总和或顺序这样基本的东西,那么事实表的设计就很糟糕。您所谓的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