web-dev-qa-db-ja.com

小売販売と支払いの組み合わせOLAPキューブ

SQL Server 2005 Standard Edition Analysis Services(SSAS)を使用しています。私はこれらの種類の質問に答えることができる小売りOLTPデータベースからキューブを構築しようとしています:

  • 特定のタイプの支払いで支払われたすべての製品(バウチャータイプXで購入された製品など)をリストします。
  • 製品Xの支払いに使用される支払いタイプの頻度の内訳を作成します(製品Xの支払いに現金が使用される回数、借方、貸方、伝票などの回数)

SALESHEADERS、SALESDETAILS、およびSALESPAYMENTSの3つの主要なトランザクションテーブルがあります。

  • SALESHEADERSには、販売日、レジ係、POSコードなどが含まれます。
  • SALESDETAILSには、ヘッダーコード、製品コード、数量、単価、総額、割引などが含まれます。
  • SALESPAYMENTSには、ヘッダーコード、支払いタイプコード、支払い金額などが含まれます。

1つのトランザクションに多くの製品を含めることができます。 1つのトランザクションは、複数のタイプの支払いで支払うことができます。ヘッダー(販売ID)を介する場合を除いて、詳細と支払いの間に関係はありません。

現在、2つのキューブ、1つの販売キューブと1つの支払いキューブを作成しました。

セールスキューブは、ヘッダーと詳細を結合することによって作成されます。支払いキューブは、ヘッダーと支払いを結合することによって作成されます。

どちらのキューブもパフォーマンスは良好ですが、私の投稿の上部にある質問に答えることができません。

4
Endy Tjahjono

ガイダンス の@JackPDouglasに感謝します、私は自分の質問に対する答えがあるかもしれないと思います。それはハックですが、うまくいくと思います:

ユーザーは、特定の種類の支払いと特定の種類の製品にのみ関心があります。詳細ビューで、これらの支払いタイプに対してのみサブクエリを添付します。

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」セクションから「from」セクションに移動して、結合させることができます。

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
2
Endy Tjahjono

「特定の種類の支払いを含むすべてのトランザクションの製品は、その支払いの種類で支払われると見なされる」と言うので、詳細と支払いの cross join から始める必要があります。したがって、複数の支払いタイプが使用されている場合は、トランザクションの一部を複数回カウントするように効果的に要求しています。