購入日に基づいてメンバーが最後に支払った価格に基づいて、2 人以上のメンバー間で購入価格を比較できるようにしようとしています。
Member、Items、UOM、Fact の 4 つのテーブルがあります。
Member (membername varchar(50), memberkey int)
Items (itemname varchar(50), itemkey int)
UOM (uomname varchar(50), uomkey int)
Fact (memberkey int, itemkey int, uomkey int, purchaseamount decimal(18,2), quantity int, purchasedate date)
私の UI では、2 つ以上のメンバーを選択して単位当たりの価格を比較できます。私の結果セットには、選択したメンバーの少なくとも 2 人がそのアイテムを購入したアイテムを含め、他のすべてを除外する必要があります。
次のようにして、メンバーリストを一時テーブルに設定しました。
declare @MemberKeys as varchar(max)
set @MemberKeys = '702,1382,1389,1390,1391,1392,1393,1394,1395,1396,1397,1401,1402,1404,1405,1406,1516,1844';
create table #mk (memberName varchar(253), memberkey smallint)
insert into #mk (memberName, memberkey)
Select Rownbr + '.) ' + membername, memberkey from (
SELECT
cast(ROW_NUMBER() OVER(ORDER BY [MemberFacilityName] ASC) as varchar (10)) AS RowNbr
,k.value as memberkey
,m.memberName
FROM
Member m
INNER JOIN dbo.String_To_SmallInt_Table(@MemberKeys, ',') AS k
ON m.Memberkey = k.value
) X
次に、一時テーブルを使用して、ファクト テーブル、単位テーブル、アイテム テーブルをクエリするときにフィルター処理を行います。
select m.membername
,i.itemname
,u.uomname
,purchaseamount
,quantity
,purchaseamount/quantity as price
from Fact f
join #mk m
on m.memberkey = f.memberkey
join Item i
on i.itemkey = f.itemkey
join UOM u
on u.uomkey= f.uomkey
次に、次のことを行う必要がありますが、それを達成するにはいくつかのガイダンスが必要です。
1.) 選択したメンバーのうち少なくとも 2 人が使用していないアイテムを除外します。
2.) 購入日に基づいて、メンバー\アイテム\uom ごとの最新の購入価格のみを表示します。
3.) 簡単に比較できるように、結果セットをメンバー、次にアイテムを表示するように並べ替えます (以下の簡略化されたリストに似ています)。
Member Item Price
mbr1 A 1.11
mbr2 A 1.12
mbr3 A 1.52
mbr4 A 2.01
mbr1 B 3.01
mbr2 B 3.03
mbr3 B 3.12
mbr4 B 3.41
mbr1 C 6.01
mbr2 C 6.63
mbr3 C 6.92
mbr4 C 6.99