Tsql 数值顺序中的多个值组合

Tsql 数值顺序中的多个值组合,tsql,combinations,Tsql,Combinations,我自己搜索并试图解决这个难题(我已经接近了,但我没有运气)。我有一个很大的值表(由值集组成),可以有多个组合,但这些组合必须按ID顺序返回 我无法在SQL中实现这一点 示例集: (很抱歉,我无法发布一张能更好解释它的图片,所以我会保持简单。) 您可以使用SQL windows函数来实现这一点 ;WITH CTE AS ( SELECT Id, Value, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RN

我自己搜索并试图解决这个难题(我已经接近了,但我没有运气)。我有一个很大的值表(由值集组成),可以有多个组合,但这些组合必须按ID顺序返回

我无法在SQL中实现这一点

示例集:

(很抱歉,我无法发布一张能更好解释它的图片,所以我会保持简单。)


您可以使用SQL windows函数来实现这一点

;WITH CTE AS
    (
    SELECT Id, 
    Value, 
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RN 
    FROM Tbl
    )

SELECT * FROM CTE ORDER BY RN, ID, VALUE

我想在这里之前已经回答了这个问题:


不同之处在于,它们实际上删除了ID列,但应该可以很容易地完成它。

在没有任何游标或循环的动态SQL中存在问题

IF OBJECT_ID('yourTable') IS NOT NULL
    DROP TABLE yourTable;

CREATE TABLE yourTable (ID INT, Value CHAR(1));

INSERT INTO yourTable
VALUES  (1,'A'),(1,'B'),(1,'C'),
        (2,'D'),
        (3,'F'),(3,'G'),
        (4,'J'),
        (5,'S'),(5,'T'),(5,'U');

DECLARE @row_number_cols    VARCHAR(MAX),
        @Aliased_Cols       VARCHAR(MAX),
        @Cross_Joins        VARCHAR(MAX),
        @Unpivot            VARCHAR(MAX);


SELECT  @row_number_cols =  COALESCE(@row_number_cols + ',','') + col,
        @Aliased_Cols =     COALESCE(@Aliased_Cols + ',','') + CONCAT(col,' AS col',ID),
        @Cross_Joins =      COALESCE(@Cross_Joins,'') + CASE
                                                            WHEN ID = 1 THEN CONCAT(' FROM (SELECT * FROM yourTable WHERE ID = 1) AS ID',ID)
                                                            ELSE CONCAT(' CROSS JOIN (SELECT * FROM yourTable WHERE ID = ',ID,') AS ID',ID)
                                                        END,
        @Unpivot = COALESCE(@Unpivot + ',','') + CONCAT('col',ID)
FROM yourTable A
CROSS APPLY (SELECT CONCAT('ID',ID,'.Value')) CA(col) --Just so I can reuse "col" in my code
GROUP BY A.ID,CA.col

SELECT @row_number_cols,@Aliased_Cols,@Cross_Joins,@Unpivot
SELECT
'WITH CTE_crossJoins
AS
(
SELECT  ROW_NUMBER() OVER (ORDER BY ' + @row_number_cols + ') group_num,' + @Aliased_Cols +
@Cross_Joins + '
)

SELECT  group_num,
        val
FROM CTE_crossJoins
UNPIVOT
(
    val for col IN (' + @Unpivot + ')
) unpvt
ORDER BY 1,2'
结果:

group_num            val
-------------------- ----
1                    A
1                    D
1                    F
1                    J
1                    S
2                    A
2                    D
2                    G
2                    J
2                    S
3                    A
3                    D
3                    G
3                    J
3                    T
4                    A
4                    D
4                    F
4                    J
4                    T
5                    A
5                    D
5                    F
5                    J
5                    U
6                    A
6                    D
6                    G
6                    J
6                    U
7                    B
7                    D
7                    G
7                    J
7                    S
8                    B
8                    D
8                    F
8                    J
8                    S
9                    B
9                    D
9                    F
9                    J
9                    T
10                   B
10                   D
10                   G
10                   J
10                   T
11                   B
11                   D
11                   G
11                   J
11                   U
12                   B
12                   D
12                   F
12                   J
12                   U
13                   C
13                   D
13                   F
13                   J
13                   S
14                   C
14                   D
14                   G
14                   J
14                   S
15                   C
15                   D
15                   G
15                   J
15                   T
16                   C
16                   D
16                   F
16                   J
16                   T
17                   C
17                   D
17                   F
17                   J
17                   U
18                   C
18                   D
18                   G
18                   J
18                   U

对不起,这很不清楚。请重写以更清楚地解释你想要完成的事情和你不理解的事情。你想要实现的是什么?提供示例代码。我相信是这样的。把ID想象成“座位”。每一排都写着一个人(信)可以坐在哪个座位上。所以A,B,C可以坐在座位1上。D在座位2。现在找到所有可能的组合步骤如果你是正确的,先生。谢谢oyu的家伙,我很抱歉没有说得更清楚,我创建了一个电子表格示例的图像,但没有上传图像的能力。链接DANGY9090提供了我的基础,我正在寻找。我不确定这是什么戴维正在寻找。我认为他想要建立5个ID的所有可能的组合,给出它们的值。谢谢你和所有帮助我的人。非常感谢你的帮助。谢谢你,斯蒂芬。你明白我想做什么。Dannyg9090链接提供了works,我创建了一个游标和循环,将它们放在行而不是列中。考虑到这一点,我想我可以用你的代码作为一个例子来做同样的事情——构建动态SQL,它执行多个交叉连接(类似于Danny给出的链接),然后取消PIVOT,这将把它们放在行中。我可以在动态SQL中做到这一点,而不需要循环或游标,因为不需要循环或游标,只要有可能,您就可以避免它们。
group_num            val
-------------------- ----
1                    A
1                    D
1                    F
1                    J
1                    S
2                    A
2                    D
2                    G
2                    J
2                    S
3                    A
3                    D
3                    G
3                    J
3                    T
4                    A
4                    D
4                    F
4                    J
4                    T
5                    A
5                    D
5                    F
5                    J
5                    U
6                    A
6                    D
6                    G
6                    J
6                    U
7                    B
7                    D
7                    G
7                    J
7                    S
8                    B
8                    D
8                    F
8                    J
8                    S
9                    B
9                    D
9                    F
9                    J
9                    T
10                   B
10                   D
10                   G
10                   J
10                   T
11                   B
11                   D
11                   G
11                   J
11                   U
12                   B
12                   D
12                   F
12                   J
12                   U
13                   C
13                   D
13                   F
13                   J
13                   S
14                   C
14                   D
14                   G
14                   J
14                   S
15                   C
15                   D
15                   G
15                   J
15                   T
16                   C
16                   D
16                   F
16                   J
16                   T
17                   C
17                   D
17                   F
17                   J
17                   U
18                   C
18                   D
18                   G
18                   J
18                   U