Sql 检查添加的结果组合是否等于一个变量
我需要一个select语句,它将查询总计列表,并计算出结果集中是否存在等于局部变量的加法组合 例如:Sql 检查添加的结果组合是否等于一个变量,sql,sql-server-2008,Sql,Sql Server 2008,我需要一个select语句,它将查询总计列表,并计算出结果集中是否存在等于局部变量的加法组合 例如: create table #mytemptable ( totals Decimal (19,2) ) insert into #mytemptable (totals) values (57.83), (244.18), (239.23), (227.79), (563.12) selec
create table #mytemptable
(
totals Decimal (19,2)
)
insert into #mytemptable (totals)
values (57.83),
(244.18),
(239.23),
(227.79),
(563.12)
select *
from #mytemptable
现在,我想检查添加时结果中的任何组合是否相等
285.62
此外,如果有多个实例可以将总计添加到等于我的变量,那么这将以适当的方式进行处理和显示,这将是一件好事。有点复杂,但它是这样的: 基本上,我的目标是生成一个动态查询,其中一列将首先标识列a上的值,第二列标识列B上的值,等等,最后一列标识总计 之后,我们可以使用多维数据集执行GROUPBY,它将所有值的排列相加,并按不同的列对它们进行分组 最终结果将显示如下内容:
Total A B C D E
285.62 NULL NULL NA NA NA
这将表明285.62是第一个值和第二个值的总和,按值排序
DECLARE @columns varchar(max) = ''
DECLARE @allcolumns varchar(max) = ''
DECLARE @columnName varchar(1) = 'A'
DECLARE @select varchar(max) = ''
SELECT
@columns = @columns + ',''NA'' AS ' + @columnName,
@allcolumns = @allcolumns + ',' + @columnName,
@columnName = CHAR(ASCII(@columnName)+1)
FROM
#mytemptable
SET @columnName = 'A'
SELECT
@select = @select + CHAR(13) + 'UNION SELECT ' + CONVERT(varchar(100),totals) + ' AS totals' + STUFF(@columns,2+10*(ord-1),4,'''' + @columnName + ''''), @columnName = CHAR(ASCII(@columnName)+1)
FROM
(SELECT totals, ROW_NUMBER() OVER(ORDER BY totals) ord from #mytemptable)
A
SET @select = STUFF(@select,1,6,'')
SET @allcolumns = STUFF(@allcolumns, 1,1,'')
--PRINT (@select)
EXEC ( 'SELECT * FROM (
SELECT SUM(totals) AS Total, ' + @allcolumns + '
FROM (' + @select + ') A GROUP BY ' + @allcolumns + ' WITH CUBE
) sub WHERE Total = 285.62 ')
如果您愿意向表中添加标识列,以下CTE解决方案将适用于您:
WITH SumOfPermutations AS
(
SELECT
CONVERT(decimal(15,2), 0) SummedTotals,
0 id
UNION ALL
SELECT
CONVERT(decimal(15,2), A.SummedTotals + B.totals),
B.ID
FROM
SumOfPermutations A
INNER JOIN myTempTable B ON A.ID < B.ID AND A.SummedTotals + B.Totals <= 285.62
WHERE
A.SummedTotals + B.totals <= 285.62
)
SELECT
COUNT(*)
FROM
SumOfPermutations
WHERE
SummedTotals = 285.62
但是,请注意,如果有大量小值,则性能将大幅降低。这是因为,一旦置换的和超过285.62,它就不再包括在内。如果你有很多小的值,那么在达到285.62阈值之前,你会有很多排列,它们有大量的值。如果您的真实数据的分布与您给出的示例数据类似,那么这应该可以快速有效地工作
如果您希望表中最多可以求和到低于285.62的值的数字是10,那么您应该可以。但是,如果您的表中有20个值低于30.0,您可能会对此有问题。组合表示第1+2行等,或者也表示第1+2+3行等?@Tim Schmelter它可以是任何一行,例如第1+2+3行=我的变量或第4+2行=我的变量。您的要求可能会降低系统的运行速度。我只需要检查86行在…@86!仍然是智能答案+1,并完全按照我的要求接受