[英]How to CONCAT and GROUP BY rows in T-SQL
這是我的桌子。 每列都表示為子查詢的結果。
id | A | B | C | (and many columns)
---+-------+-------+-------+----------+--------+-----+-...
1 | 1a3b | 1a2b | 4a1b | |
2 | 7a3b | 3a7b | 7a7b | |
3 | 2a3b | 1a3b | 3a6b | |
4 | 6a3b | 6a3b | 6a3b | |
我的表中有很多列,不僅有A、B和C。 結果由CONCAT
方法生成。
SELECT CONCAT(A,B,C,...) FROM myTable
這就是我得到的。 不是我想要的答案。
id | A | B | C | result |
---+-------+-------+-------+---------------+
1 | 1a3b | NULL | 4a1b | 1a3b4a1b |
2 | 7a3b | 3a7b | 7a3b | 7a3b3a7b7a3b |
3 | 2a3b | 1a3b | 3a6b | 2a3b1a3b3a6b |
4 | 6a3b | 6a3b | 6a3b | 6a3b6a3b6a3b |
我找不到"group by"
並獲得如下結果以刪除(或不 CONCAT)重復值的方法。 有沒有辦法做到這一點?
id | A | B | C | result |
---+-------+-------+-------+---------------+
1 | 1a3b | NULL | 4a1b | 1a3b4a1b |
2 | 7a3b | 3a7b | 7a3b | 7a3b3a7b |
3 | 2a3b | 1a3b | 3a6b | 2a3b1a3b3a6b |
4 | 6a3b | 6a3b | 6a3b | 6a3b |
一種基於VALUES
表值構造函數和FOR XML
的方法是一種選擇:
桌子:
SELECT *
INTO Data
FROM (VALUES
(1, '1a3b', NULL, '4a1b'),
(2, '7a3b', '3a7b', '7a3b'),
(3, '2a3b', '1a3b', '3a6b'),
(4, '6a3b', '6a3b', '6a3b')
) v (id, A, B, C)
陳述:
SELECT
*,
result = (
SELECT DISTINCT CONCAT('', c)
FROM (VALUES (A), (B), (C)) v (c)
FOR XML PATH('')
)
FROM Data
結果:
id A B C result
-------------------------------
1 1a3b Null 4a1b 1a3b4a1b
2 7a3b 3a7b 7a3b 3a7b7a3b
3 2a3b 1a3b 3a6b 1a3b2a3b3a6b
4 6a3b 6a3b 6a3b 6a3b
如果我做對了
select id,A,B,C, string_agg(s, '')
from mytable
cross apply (
select distinct s
from ( values(A),(B),(C)) t(s)
) t(s)
group by id,A,B,C
下面的查詢應該工作:
DECLARE @table table(id int, a char(4), b char(4), c char(4))
insert into @table values
(2 ,'7a3b','3a7b','7a3b')
SELECT a,b,c, string_agg(t1.dval,'') WITHIN GROUP (ORDER BY a,b,c)) as conc
from @table as ot
CROSS APPLY
(
SELECT DISTINCT val from
(
VALUES
(left(a,2)),
(right(a,2)),
(left(b,2)),
(right(b,2)),
(left(c,2)),
(right(c,2))
)t(val)
) as t1(dval)
group by a,b,c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.