创建 2、3 或 4 列的每个唯一组合的总和

Posted

技术标签:

【中文标题】创建 2、3 或 4 列的每个唯一组合的总和【英文标题】:Creating a sum of each unique combination of 2, 3 or 4 columns 【发布时间】:2020-12-21 10:31:53 【问题描述】:

这就是我的桌子现在的样子:

DECLARE @indicators TABLE([Date_row] date, ind1 int, ind2 int, ind3 int, ind4 int, ind5 int);
INSERT INTO @indicators VALUES
  ('2010-01-01', 1, 0, 0, 0, 1)
, ('2011-01-01', 1, 0, 0, 0, 1)
, ('2012-01-01', 1, 1, 1, 0, 1)
, ('2013-01-01', 1, 1, 0, 1, 1)
, ('2014-01-01', 1, 0, 1, 1, 0)
, ('2015-01-01', 1, 0, 1, 1, 0)

select * from @indicators

Date_row    ind1    ind2    ind3    ind4    ind5
2010-01-01  1   0   0   0   1
2011-01-01  1   0   0   0   1
2012-01-01  1   1   1   0   1
2013-01-01  1   1   0   1   1
2014-01-01  1   0   1   1   0
2015-01-01  1   0   1   1   0

我正在寻找的结果是 ind1、ind2、ind3、ind4、ind5 的每个唯一 2 列组合的总和

所以基本上:

SELECT
ind1 + ind2 as ind1_ind2,
ind1 + ind3 as ind1_ind3,
ind1 + ind4 as ind1_ind4,
ind1 + ind5 as ind1_ind5,
ind2 + ind3 as ind2_ind3,
...

但对于所有列,最好能够为我指定的许多列(2、3、4 等)创建这种组合

我可以想象我将如何在 python 或 R 中创建它,但很难看到如何使用 SQL Server 来做到这一点。带有cross joinpivot/unpivotcross apply 的东西。希望有人能指出我正确的方向。

【问题讨论】:

很高兴看到您的尝试。 如果你想从数据中动态创建列,那么你需要动态SQL。 查询地址为***.com/q/59971453/11683。从您想要的列名动态生成它们。 请显示您想要的结果。 【参考方案1】:

您可以取消透视数据并将数据放在而不是列中:

with u as (
      select i.*, v.*
      from indicators i cross apply
           (values ('ind1', ind1), ('ind2', ind2), ('ind3', ind3), ('ind4', ind4), ('ind5', ind5)
           ) v(ind, val)
     )
select u1.ind, u2.ind, sum(u1.val + u2.val)
from u u1 join
     u u2
     on u1.date_row = u2.date_row and u1.ind < u2.ind
group by u1.ind, u2.ind;

Here 是一个 dbfiddle。

您可以通过在 from 子句中添加更多连接轻松地将其扩展到更多组合。

【讨论】:

以上是关于创建 2、3 或 4 列的每个唯一组合的总和的主要内容,如果未能解决你的问题,请参考以下文章

查找并打印总和为 100 的每个唯一组合,并返回 1 到 100 之间数字的所有此类组合的计数 [重复]

组合 3 个表,其中 2 列的组合不是唯一的

216 Combination Sum III 组合总和 III

您可以使用 Excel 的新动态函数创建交叉表吗?

多列组合在猪中唯一

查找具有给定总和的数字列表的所有组合