T-SQL :: 使用 GROUP BY CUBE 生成所有可能的组合

T-SQL :: use GROUP BY CUBE to generate all possible combinations

在一个post中我发现我可以使用GROUP BY CUBE找到所有可能的组合:

select concat(a,b,c,d)
from (select 'a','b','c','d') as t(a,b,c,d)
group by cube(a,b,c,d)
having len(concat(a,b,c,d)) = 3

代码很漂亮,因为很容易理解。 我想使用相同的代码,但使用 int 而不是 char。基本上我想找到所有可能的数字组合 (1,2,3,4)。

目标是对它们求和并生成所有可能的总数:

我正在尝试解决 T-SQL 中的 knapsack problem,我想看看 GROUP BY CUBE 是否可以作为解决方案

您需要更明确地考虑 NULLs,但像这样:

select coalesce(a, 0) + coalesce(b, 0) + coalesce(c, 0) + coalesce(d, 0)
from (values (1, 2, 3, 4)) t(a,b,c,d)
group by cube(a,b,c,d)
having (case when a is not null then 1 else 0 end +
        case when b is not null then 1 else 0 end +
        case when c is not null then 1 else 0 end +
        case when d is not null then 1 else 0 end
       ) = 3;

Here 是一个 db<>fiddle.

我应该注意,执行此操作的另一种方法是使用显式连接:

with t as (
      select t.*
      from (values (1), (2), (3), (4)) t(x)
     )
select t1.x + t2.x + t3.x
from t t1 join
     t t2
     on t1.x < t2.x join
     t t3
     on t2.x < t3.x;

如果值可以重复,则这些并不完全相同。但是,您可能会发现 join 版本在处理大量数据时速度更快。