我有一个有 2 列的表格,如下所示:
+----------+----------+
| Column A | Column B |
+----------+----------+
| 123 | ABC |
| 123 | XYC |
| 123 | FGH |
| 145 | QWE |
| 147 | YUI |
+----------+----------+
我想从表中选择所有值,但查看它 - 像这样:
+----------+---------+---------+----------+
| Column A | value 1 | value 2 | value 3 |
+----------+---------+---------+----------+
| 123 | ABC | XYC | FGH |
| 145 | QWE | | |
| 147 | YUI | | |
+----------+---------+---------+----------+
GROUP_CONCAT
和您选择的分隔符即可。例如:
SELECT `Column A`,
GROUP_CONCAT(`Column B` SEPARATOR ' | ') AS `Values`
FROM table1
GROUP BY `Column A`
输出:
Column A Values
123 ABC | XYC | FGH
145 QWE
147 YUI
我不确定您将如何执行查询?但是,如果您可以设法创建动态 SQL 查询字符串来查找所有重复行,并将每行插入到临时表中,并将其他值(唯一)插入到单独的临时表中。然后创建另一个查询将所有临时表(具有重复的)值连接到一个新的数据集中,将所有这些值与(唯一的)数据集联合起来。
这可能是一个很长而且不是一个好的解决方案,但这是我的实验:
将所有重复行插入#temp 表(3 行= 3 #temp 表)
选择 ID、姓名 进入#temp1 来自测试表 WHERE 名称='ABC'选择 ID、姓名 进入#temp2 来自测试表 名称='XYC'
选择 ID、姓名 进入#temp3 来自测试表 WHERE 名称='FGH'
选择 ID、姓名 进入#temp4 来自测试表 哪里 Id!=123
选择 t1.Id,t1.Name 作为 Value1,t2.Name 作为 Value2,t3.Name 作为 Value3 来自#temp1 t1 t1.Id=t2.Id 上的内连接 #temp2 t2 t1.Id=t3.Id 上的内连接 #temp3 t3 联合所有 SELECT t4.Id,t4.Name 作为 Value1,null 作为 Value2,null 作为 Value3 来自#temp4 t4
如果您想要三个不同的列,您可以使用
row_number()
和条件聚合:
select a,
max(case when seqnum = 1 then b end) as b_1,
max(case when seqnum = 2 then b end) as b_2,
max(case when seqnum = 3 then b end) as b_3
from (select t.*,
row_number() over (partition by a order by b) as seqnum
from t
) t
group by a;