【问题标题】:concat a column fields of a table group by the fields of another table通过另一个表的字段连接表组的列字段
【发布时间】:2016-01-04 13:17:33
【问题描述】:

我有两个表 t1 和 t2 与 testid 连接。如果 d1,d2 和表 t1 的 id 相同,我需要连接 t2 的 val 列。请参考下表。

    CREATE TABLE #t1 (d1 varchar(100),d2 varchar(100),id int,testid int)

    INSERT INTO #t1 (d1,d2,id,testid) VALUES ('p','q',1,101)
    INSERT INTO #t1 (d1,d2,id,testid) VALUES ('r','s',2,102)
    INSERT INTO #t1 (d1,d2,id,testid) VALUES ('p','q',1,103)
    INSERT INTO #t1 (d1,d2,id,testid) VALUES ('r','s',1,104)

    CREATE TABLE #t2 (testid int,val varchar(100))

    INSERT INTO #t2 (testid,val) values (101,'x')
    INSERT INTO #t2 (testid,val) values (102,'y')
    INSERT INTO #t2 (testid,val) values (103,'z')
    INSERT INTO #t2 (testid,val) values (104,'xx')

The result should be:

    d1 d2 pid val
    p  q  1   x,z
    r  s  2   y
    r  s  1   xx

【问题讨论】:

  • 哪部分让你有困难?
  • 谷歌:“sql server 聚合字符串连接”

标签: sql sql-server concatenation


【解决方案1】:
IF OBJECT_ID('tempdb.dbo.#t1') IS NOT NULL
    DROP TABLE #t1

IF OBJECT_ID('tempdb.dbo.#t2') IS NOT NULL
    DROP TABLE #t2

CREATE TABLE #t1 (d1 VARCHAR(100), d2 VARCHAR(100), id INT, testid INT)
INSERT INTO #t1 (d1, d2, id, testid)
VALUES ('p', 'q', 1, 101)
     , ('r', 's', 2, 102)
     , ('p', 'q', 1, 103)
     , ('r', 's', 1, 104)

CREATE TABLE #t2 (testid INT, val VARCHAR(100))
INSERT INTO #t2 (testid, val)
VALUES (101, 'x')
     , (102, 'y')
     , (101, 'z')
     , (104, 'xx')

SELECT *
FROM (
    SELECT d1, d2, id, value = STUFF((
        SELECT [text()] = ',' + val
        FROM #t2
        WHERE #t2.testid = #t1.testid
        FOR XML PATH('')), 1, 1, '')      
    FROM #t1
) t
WHERE t.value IS NOT NULL

输出 -

d1  d2  id   value
--- --- ---- ----------------
p   q   1    x,z
r   s   2    y
r   s   1    xx

【讨论】:

  • 谢谢。实际上我还有其他列,例如 t1 中的 a1 - 这也需要选择。是否可以使用相同的查询?
  • 请提供数据样本和预期结果。
  • 实际上,我的 t1 表是多个连接查询的结果。它还有许多其他字段。为简单起见,我没有写在我的问题中。例如创建表 #t1 (a1 varchar(100) d1 VARCHAR(100), d2 VARCHAR(100), id INT, testid INT)
  • SELECT *, value = STUFF(... ?
  • INSERT INTO #t1 (a1,d1, d2, id, testid) 值 ('c','p', 'q', 1, 101) , ('d','r' , 's', 2, 102) , ('c','p', 'q', 1, 103) , ('e','r', 's', 1, 104) 和结果:a1 d1 d2 id 值 --- --- ---- ---------------- c p q 1 x,z d r s 2 y e r s 1 xx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多