SQL Server 2005 Standard Edition Analysis Services(SSAS)を使用しています。私はこれらの種類の質問に答えることができる小売りOLTPデータベースからキューブを構築しようとしています:
SALESHEADERS、SALESDETAILS、およびSALESPAYMENTSの3つの主要なトランザクションテーブルがあります。
1つのトランザクションに多くの製品を含めることができます。 1つのトランザクションは、複数のタイプの支払いで支払うことができます。ヘッダー(販売ID)を介する場合を除いて、詳細と支払いの間に関係はありません。
現在、2つのキューブ、1つの販売キューブと1つの支払いキューブを作成しました。
セールスキューブは、ヘッダーと詳細を結合することによって作成されます。支払いキューブは、ヘッダーと支払いを結合することによって作成されます。
どちらのキューブもパフォーマンスは良好ですが、私の投稿の上部にある質問に答えることができません。
ガイダンス の@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
「特定の種類の支払いを含むすべてのトランザクションの製品は、その支払いの種類で支払われると見なされる」と言うので、詳細と支払いの cross join
から始める必要があります。したがって、複数の支払いタイプが使用されている場合は、トランザクションの一部を複数回カウントするように効果的に要求しています。