2

合計のリストを調べて、ローカル変数と等しい結果セット内に追加の組み合わせが存在するかどうかを判断する select ステートメントが必要です。

例:

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

また、合計を追加して変数と等しくすることができる複数のインスタンスがあれば、これは適切な方法で処理および表示されると便利です。

4

2 に答える 2

2

少し複雑ですが、次のようになります。

基本的に私の目的は、1 つの列が値 (列 A の最初の値、列 B の 2 番目の値など) を識別し、最後に合計の列を識別する動的クエリを生成することです。

その後、キューブを使用してグループ化を実行できます。これにより、値のすべての順列が合計され、異なる列でグループ化されます。例を見る

最終結果は次のようになります。

Total   A     B  C   D  E
285.62 NULL NULL NA NA NA

これは、285.62 が値でソートされた最初と 2 番目の値の合計であることを示します。

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 ')
于 2013-07-04T11:37:54.240 に答える
0

テーブルに ID 列を追加する場合は、次の 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 程度であると予想される場合は、問題ありません。ただし、テーブルに 30.0 未満の 20 個の値がある場合、おそらくこれで問題が発生します。

于 2013-07-04T13:47:54.760 に答える