【发布时间】:2012-08-19 03:12:00
【问题描述】:
我需要一种方法来在一种窗口函数中连接所有行(每组),例如您可以如何执行COUNT(*) OVER(PARTITION BY...) 并且每组所有行的总计数将在每个特定组中重复。我需要类似的东西,但每组所有值的字符串连接在每组中重复。
这是一些示例数据和我想要的结果,以更好地说明我的问题:
grp | val
------------
1 | a
1 | b
1 | c
1 | d
2 | x
2 | y
2 | z
这就是我需要的(期望的结果):
grp | val | groupcnct
---------------------------------
1 | a | abcd
1 | b | abcd
1 | c | abcd
1 | d | abcd
2 | x | xyz
2 | y | xyz
2 | z | xyz
这是这个问题真正棘手的部分:
我的特殊情况使我无法两次引用同一个表(我实际上是在递归 CTE 中执行此操作,因此我无法对 CTE 进行自联接,否则会引发错误)。
我完全知道人们可以这样做:
SELECT a.*, b.groupcnct
FROM tbl a
CROSS APPLY (
SELECT STUFF((
SELECT '' + aa.val
FROM tbl aa
WHERE aa.grp = a.grp
FOR XML PATH('')
), 1, 0, '') AS groupcnct
) b
但如您所见,即在查询中引用了tbl 两次。
我只能引用tbl 一次,因此我想知道是否可以将组连接窗口化(我对 TSQL 有点陌生,因为我来自 MySQL 背景,所以不确定是否可以做类似的事情。
创建表:
CREATE TABLE tbl
(grp int, val varchar(1));
INSERT INTO tbl
(grp, val)
VALUES
(1, 'a'),
(1, 'b'),
(1, 'c'),
(1, 'd'),
(2, 'x'),
(2, 'y'),
(2, 'z');
【问题讨论】:
-
@PankajGarg 这实际上是一个结果,而不是一个表格。查询已经在递归 CTE 中完成,因此不能选择使用 CTE。我需要这个的原因是因为我在使用 CTE 遍历表时试图跟踪以前递归层的值。
-
如果没有递归查询,这个问题没有多大意义。您始终可以将查询结果输出到临时表中,并对其进行分组连接。
-
引用递归版本指出选择那种方式不好:stackoverflow.com/questions/11137075/…最好用
XML PATH
标签: sql sql-server sql-server-2008 tsql string-aggregation