在使用in()语句-TSQL进行计算时,是否可能包含重复的ID?
我正在使用一个SP,它将销售的产品ID作为逗号分隔字符串作为输入 限制:在使用in()语句-TSQL进行计算时,是否可能包含重复的ID?,sql,tsql,Sql,Tsql,我正在使用一个SP,它将销售的产品ID作为逗号分隔字符串作为输入 限制: 无法添加新输入 无法更改输入数据类型 我有一个函数,它获取输入的逗号分隔字符串,并返回一个表,其中包含每个id的一行 SELECT * FROM SplitStringIDsIntoTable(@ProductIDs,',') 然后,为了能够计算每件售出商品的成本(如果该商品售出3次,我需要将其COG添加3次,不幸的是,获得一个新输入来告诉我每件售出商品的数量是毫无疑问的),我做了如下操作: SET x = (SEL
- 无法添加新输入
- 无法更改输入数据类型
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循环
附:我不知道如何在标题中问这个问题,所以问题标题可能看起来毫无意义。请随时更新 使用
加入而不是中的:
SELECT @x = SUM(p.COG)
FROM Products p JOIN
dbo.SplitStringIDsIntoTable(@ProductIDs, ',') ss
ON p.ProductId = ss.ProductId;
使用JOIN
而不是中的:
SELECT @x = SUM(p.COG)
FROM Products p JOIN
dbo.SplitStringIDsIntoTable(@ProductIDs, ',') ss
ON p.ProductId = ss.ProductId;
如果您有一个ID重复的列表,
中的不会复制结果,而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])
结果
如果您有一个ID重复的列表,
中的将不会复制结果,而中的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返回了5Thx,这一点我很感激,但我不得不删除(ProductID),然后它就工作了。否则我会得到:表值函数“SplitStringIDsIntoTable”不能有列别名。它的工作原理是这样的:从Products p JOIN dbo.SplitStringIDsIntoTable(@ProductIDs,,')ss中选择@x=SUM(p.COG)p.ProductId=ss.ProductId;Thx非常感谢,但我必须删除(ProductID),然后它才能工作。否则我会得到:表值函数“SplitStringIDsIntoTable”不能有列别名。它的工作原理是这样的:从Products p JOIN dbo.SplitStringIDsIntoTable(@ProductIDs,,')ss中选择@x=SUM(p.COG)p.ProductId=ss.ProductId;