2017-04-13 1 views
-1

J'ai une fonction table valorisée qui retourne l'ensemble des lignes qui correspond à une somme donnée, Cela fonctionne bien avec des valeurs positives mais pas avec des valeurs négatives.Les valeurs négatives de la somme des sous-ensembles SQL

Quelqu'un peut-il modifier cette fonction pour travailler avec les valeurs positives et négatives (champ de prix)

La fonction prend une table avec des valeurs décimales, puis revenez la première combinaison de lignes qui correspondent à une somme donnée dans le paramètre:

Par exemple, si l'@psum = 9 et le tableau ci-dessous:

n id price 
1 1 4.00 
2 2 4.00 
3 3 5.00 
4 4 6.00 
5 5 8.00 

sORTIR est mis:

select * from SubsetSum2(9) 

n id price 
3 3 5.00 
2 2 4.00 

alter FUNCTION [dbo].[SubsetSum2](@psum int) 
RETURNS @tt table (n int,id int, price numeric(20,2)) 
AS 
BEGIN 

declare @t table (n int IDENTITY(1,1), id int, price numeric(20,2)) 
insert into @t -- note asc order of book prices 

select 1, 4 union all 
select 2, 4 union all 
select 3, 5 union all 
select 4, 6 union all 
select 5, 8 

declare @rows int, @p numeric(20,2), @sum numeric(20,2) set @sum= 9 
delete from @t where price>@sum 
set @p=(select sum(price) from @t) 

if @p>= @sum 
begin --1 
set @rows=(select max(n) from @t) 
declare @n int, @s numeric(20,2) 
set @[email protected]+1 set @s=0 
while 0=0 
begin --2 
while @n>1 
begin --3 
set @[email protected] 
if @s+(select price from @t where [email protected])<[email protected] 
and @s+(select sum(price) from @t where n<[email protected])>[email protected] 
begin --4 
set @[email protected]+(select price from @t where [email protected]) 
insert into @tt select n, id, price from @t where [email protected] 
if @[email protected] return ; 
end --4 
end --3 
set @n=(select min(n) from @tt) 
set @[email protected](select price from @tt where [email protected]) 
delete from @tt where [email protected] 
if @s=0 and (select sum(price) from @t where n<@n)<@sum break 
end --2 
end --1 

return 
END 
+0

Veuillez nous faire gagner du temps en nous disant ce que la fonction fait par rapport à ce qu'elle devrait faire. avec quelques exemples de sortie. – Stephen

+0

'-5 + 5 + 5 + 4 = 9' n'est-ce pas? voulez-vous que vos montants négatifs soient traités comme positifs? – Stephen

+0

oui c'est correct, mais la fonction ne fonctionne pas avec cet exemple. – oussama

Répondre

-1

Utiliser la fonction Absolue ABS (prix) pour traiter les négatifs comme positifs

+0

Je ne veux pas traiter négatif comme positif – oussama