【问题标题】:How to CONCAT and GROUP BY rows in T-SQL如何在 T-SQL 中 CONCAT 和 GROUP BY 行
【发布时间】:2021-03-05 08:18:58
【问题描述】:

这是我的桌子。每列都表示为子查询的结果。

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" 行并获得如下结果以删除(或不连接)重复值的方法。有没有办法做到这一点?

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          |

【问题讨论】:

  • 您的 SQL Server 版本是多少?
  • Each column is representing as a result of a subquery.There are many rows in my table, not only A, B and C. 是什么意思?
  • @Squirrel 子查询是字符串的结果,因此您可以像处理字符串一样处理它。对于第二句话,我犯了一个错误。 “我的桌子上有很多column,不只是A、B和C。”而不是rows
  • @Zhorov 我的版本是“Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 版权所有 (c) Microsoft Corporation Standard Edition (64-位) 在 Windows Server 2012 R2 Datacenter 6.3 (Build 9600: ) (Hypervisor) "

标签: sql sql-server group-by concatenation row


【解决方案1】:

一种基于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

【讨论】:

  • "FROM (VALUES (A), (B), (C)) v (c)" 行中有一个 'v'。那个'v'的名字和功能是什么?我以前从未见过。
  • @Clyde 这是VALUES table-value 构造函数的别名。以及来自同一 source 的示例。
【解决方案2】:

如果我做对了

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

【讨论】:

    【解决方案3】:

    下面的查询应该可以工作:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2020-06-04
      • 2016-03-06
      • 2012-10-02
      • 2021-06-03
      相关资源
      最近更新 更多