是否可以使用IN()语句 - TSQL在计算中包含重复的ID?

时间:2016-09-16 01:07:48

标签: sql tsql

我正在开发一个SP,以逗号分隔的字符串作为输入获取已售出的产品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一次。

例如,假设我卖的产品ID输入为'11,12,13,11,13'

我的sql语句是:

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

返回完全相同的结果:

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

没有给出正确的总数。 我正在寻找的是,是否有任何声明同时考虑重复值?

我不想使用While Loop。

PS:我不确定如何在标题中提出这个问题,所以问题标题可能看起来毫无意义。随意更新它。

2 个答案:

答案 0 :(得分:1)

使用JOIN代替IN

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

答案 1 :(得分:1)

如果您有一个包含重复ID的列表,IN将不会在JOIN期间重复显示结果。例如:

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而JOIN返回5