これはフォローアップの質問os thisです。他の人は重要な部分(どのようにパーティションによってSUM
に答えます)私はそれを受け入れています。しかし、別の部分は私を心配しています。多対多リレーションシップを持つDistinct SUM
「左」側を1回だけカウントする必要がある場合は、多対多の関係での方法はSUM
になります。
declare @t1 table (ID int,Price money, Name varchar(10))
declare @t2 table (ID int,Orders int, Name varchar(10))
declare @relation table (t1ID int,t2ID int)
insert into @t1 values(1, 200, 'AAA');
insert into @t1 values(2, 150, 'BBB');
insert into @t1 values(3, 100, 'CCC');
insert into @t2 values(1,25,'aaa');
insert into @t2 values(2,35,'bbb');
insert into @relation values(1,1);
insert into @relation values(2,1);
insert into @relation values(3,2);
-- following record will cause the "wrong" sum
insert into @relation values(2,2);
select
T2.Name as T2Name
,T2.Orders As T2Orders
,T1Sum.Price As T1SumPrice
,T1.Price As T1HighestPrice
,T1.Name As T1HighestPrice_Name
FROM @t2 T2
INNER JOIN (
SELECT Rel.t2ID
,Rel.t1ID
,ROW_NUMBER()OVER(Partition By Rel.t2ID Order By Price DESC)As PriceList
,SUM(Price)OVER(PARTITION BY Rel.t2ID) AS Price
FROM @t1 T1
INNER JOIN @relation Rel ON Rel.t1ID=T1.ID
)AS T1Sum ON T1Sum.t2ID = T2.ID AND t1Sum.PriceList = 1
INNER JOIN @t1 T1 ON T1Sum.t1ID=T1.ID
実際の結果:
T2Name T2Orders T1SumPrice T1HighestPrice T1HighestPrice_Name
aaa 25 350,00 200,00 AAA
bbb 35 250,00 150,00 BBB
望ましい結果:
T2Name T2Orders T1SumPrice T1HighestPrice T1HighestPrice_Name
aaa 25 350,00 200,00 AAA
bbb 35 100,00 150,00 BBB
お知らせT1SumPrice
の違い
は、うまくいけば私の問題を説明し、次のサンプルデータを考えてみましょう。 relation-tableの最後のエントリはすでに別のT2(aaa
)に割り当てられていたbbb
にT1を挿入するため、T2-グループの名前はaaa
ですでにT1SumPrice
になっています。
それで、すでに別のグループの一部である場合に値を2回カウントするのを防ぐにはどうすればよいですか?
編集:
これは、(実際にテーブル値関数の一部である)Nikola's answerから得られたクエリです。私は値を取得するスカラー値関数を使用する必要があることに注意してください:
select T2.idSparePart As T2_ID
,T2.PartNumber as T2_PartNumber
,Gambio.getGoodsIn(T2.idSparePart,@FromDate,@ToDate) AS GoodsIn
,Gambio.getOrdered(T2.idSparePart,@FromDate,@ToDate) AS Ordered
,T1Sum.ClaimedReused As T1SumPrice_ClaimedReused
,T1Sum.Costsaving As T1SumPrice_Costsaving
,T1.Price As T1HighestPrice
,T1.idSparePart AS T1HighestPrice_ID
,T1.SparePartName As T1HighestPrice_Number
,T1.SparePartDescription As T1HighestPrice_Name
,Cat.SparePartCategoryName As T1HighestPrice_Category
FROM Gambio.SparePart T2
INNER JOIN (
SELECT Rel.fiSparePart
,Rel.fiTabSparePart
,ROW_NUMBER()OVER(Partition By Rel.fiSparePart Order By Price DESC)As PriceList
,SUM(Gambio.getMaterialQuantity(Rel.fiTabSparePart,NULL,NULL,@idClaimStatus,1))OVER(PARTITION BY Rel.fiSparePart) AS ClaimedReused
,SUM(Gambio.getCostSaving(Rel.fiTabSparePart,NULL,NULL,@idClaimStatus))OVER(PARTITION BY Rel.fiSparePart) AS Costsaving
FROM tabSparePart T1
INNER JOIN
(select fiTabSparePart
, fiSparePart
from Gambio.trelSparePartClaimGroup relation
where not exists (
select null
from Gambio.trelSparePartClaimGroup rel
where rel.fiTabSparePart = relation.fiTabSparePart
and rel.fiSparePart < relation.fiSparePart
)
)
Rel ON Rel.fiTabSparePart=T1.idSparePart
)AS T1Sum ON T1Sum.fiSparePart = T2.idSparePart AND t1Sum.PriceList = 1
INNER JOIN tabSparePart T1 ON T1Sum.fiTabSparePart=T1.idSparePart
INNER JOIN tabSparePartCategory AS Cat
ON Cat.idSparePartCategory=T1.fiSparePartCategory
残念ながら、私が間違った結果を行うための
どのようにt1行の値を複数のグループの共通メンバーであるt2グループに分割したいですか?与えられた例では、t1.ID 2はt2.ID 1と2のメンバーです(つまり 'aaa'と' bbb') - その値を 'aaa'に完全に代入したいと思っていますが、そのための根底にある論理についての説明はありません。 –
希望の結果のT1Sum価格が150ではなく100であってはなりませんか? – GarethD
@マーク:問題はそのような論理がないということです。唯一防止すべきことは、「T1価格」が何度も数えられることです。最後に、これらの値は別の 'Group By T1Category'の下に含まれます。だから私は正しい順序カウント(合計されていない)と私はグループ化するために使用することができる1つの関連するT1行ですべての別個のT2行を取得することを確認する必要があります。 –