Sql-Server-2005

結合零售銷售和支付 OLAP 多維數據集

  • May 12, 2011

我正在使用 SQL Server 2005 標準版分析服務 (SSAS)。我正在嘗試從可以回答這些問題的零售 OLTP 數據庫建構多維數據集:

  • 列出使用某種付款方式支付的所有產品(哪些產品是使用 X 類型的憑證購買的,等等)
  • 創建用於支付產品 X 的付款類型的頻率細分(使用現金支付產品 X 的次數,借方、貸方、代金券等的次數)

有 3 個主要事務表:SALESHEADERS、SALESDETAILS 和 SALESPAYMENTS。

  • SALESHEADERS 包含銷售日期、收銀員、POS 碼等。
  • SALESDETAILS 包含標題程式碼、產品程式碼、數量、單價、毛額、折扣等。
  • SALESPAYMENTS 包含標題程式碼、付款類型程式碼、付款金額等。

一筆交易可以包含許多產品。一筆交易可以通過多種付款方式進行支付。除了通過標題(銷售 ID)外,明細和付款之間沒有任何联系。

目前我已經創建了 2 個立方體,一個銷售立方體和一個支付立方體。

銷售立方體是通過連接標題和細節來創建的。付款立方體是通過加入標題和付款來創建的。

兩個立方體都表現良好,但它們無法回答我文章頂部的問題。

感謝@JackPDouglas 的指導,我想我可能對自己的問題有一個答案。這是一個hack,但我認為它會起作用:

使用者只對某些類型的支付和某些類型的產品感興趣。我將僅在詳細視圖中為那些付款類型附加子查詢:

select
   case when exists (
       select top 1 1
       from salespayments
       where salesid = D.salesid
       and paytypeid = 6
   ) then 1 else 0 end as IsPaidWithVoucher,
   D.productid,
   D.qty,
   ...
from salesdetails D
inner join salesheaders H on D.salesid = H.id
...

付款視圖中還有一些產品子查詢。想法?

編輯

正如@JackPDouglas 所建議的,可以將子查詢從“選擇”部分移動到“來自”部分以使其成為連接:

select
   isnull(P.IsPaidWithVoucher, 0) as IsPaidWithVoucher,
   D.productid,
   D.qty,
   ...
from salesdetails D
inner join salesheaders H on D.salesid = H.id
left outer join (
   select distinct salesid, 1 as IsPaidWithVoucher
   from salespayments
   where paytypeid = 6
) P on D.salesid = P.salesid
...

或者它也可以做成一個單獨的視圖:

create view SalesPaidWithVoucher as
select distinct salesid, 1 as IsPaidWithVoucher
from salespayments
where paytypeid = 6

您需要從cross join詳細資訊和付款開始,因為您說“任何包含某種付款類型的交易中的產品都被視為使用該付款類型付款”,因此您實際上是在要求交易的部分內容是如果使用了多種支付類型,則計算多次。

引用自:https://dba.stackexchange.com/questions/2616