2016-09-16 5 views
0

私は、販売された製品IDをコンマで区切った文字列を入力として取得するSPに取り組んでいます。IN()文 - TSQLを使用して計算に重複IDを含めることはできますか?

制限

  • 新しい入力を追加することはできませんが、入力データ型

を変更することはできません私は、入力されたカンマ区切りの文字列を取得し、テーブルを返す関数を持っています各IDの行が含まれます。

SELECT * FROM SplitStringIDsIntoTable(@ProductIDs,',') 

次に、各販売品目の財のコストを計算することができるようにする(項目が3回を売却した場合、私はそのCOG 3回を追加する必要があり、残念ながらそれは新しい入力を取得するには問題外であります)私は、各販売アイテムの数量を指示し、私のような何かをやっていた:

SET x = (SELECT SUM(p.COG) FROM Products p WHERE p.ProductId IN 
    (SELECT * FROM SplitStringIDsIntoTable(@ProductIDs,','))) 

しかし、ここで問題は、私は、入力として数量を持っていない、です。 IN()ステートメントを使用すると、各IDは予想通り1回だけカウントされます。

:とまったく同じ結果を返す

SET x = (SELECT SUM(p.COG) FROM Products p WHERE p.ProductId IN 
     ('11,12,13,11,13')) 

:例えば

は私のSQL文は次のようになり12,13,11,13' 、

を'11として入力された私の販売製品IDを言うことができます

SET x = (SELECT SUM(p.COG) FROM Products p WHERE p.ProductId IN 
     ('11,12,13')) 

これは正しい合計を与えません。 私が探しているのは、重複した値も考慮に入れていますか?

私はWhileループを使いたくありません。

PS:タイトルでこの質問をする方法がわからないので、質問タイトルは意味がないように見えるかもしれません。それを更新してください。代わりにIN

答えて

1

使用JOIN

SELECT @x = SUM(p.COG) 
FROM Products p JOIN 
    dbo.SplitStringIDsIntoTable(@ProductIDs, ',') ss 
    ON p.ProductId = ss.ProductId; 
+0

Thxを多くのJOIN戻ったが、私は(商品コード)を削除する必要がありました。そうでなければ、私は次のようになりました: テーブル値関数 'SplitStringIDsIntoTable'は列エイリアスを持つことができません。このように作業 その:製品Pから @x SELECT = SUM(p.COG) はp.ProductId = ss.ProductId ON dbo.SplitStringIDsIntoTable(@ProductIDs、 '')SS を登録しよう。 – curiousBoy

1

重複したIDのリストを持っている場合は、INJOINますが結果を再現しません。たとえば:

Declare @List varchar(50)='10,11,12,11,11' 

-- Using IN Returns 
Select count(*) 
From OD 
Where [OD-Nr] IN (Select Key_Value from [dbo].[udf-Str-Parse](@List,',')) 

-- Using JOIN 
Select count(*) 
From [OD] A 
Join (Select Key_Value from [dbo].[udf-Str-Parse](@List,',')) B on (Key_Value=A.[OD-Nr]) 

結果

それが働いINは、私がいることに感謝します3しばらくは戻っ5

関連する問題