Tsql 数值顺序中的多个值组合
我自己搜索并试图解决这个难题(我已经接近了,但我没有运气)。我有一个很大的值表(由值集组成),可以有多个组合,但这些组合必须按ID顺序返回 我无法在SQL中实现这一点 示例集: (很抱歉,我无法发布一张能更好解释它的图片,所以我会保持简单。)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
您可以使用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