从一列中选择重复的值并在一行中获取该值

问题描述 投票:0回答:3

我有一个有 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     |         |          |
+----------+---------+---------+----------+
mysql sql database duplicates
3个回答
0
投票

如果您不想在输出中创建额外的列,则只需使用

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

dbfiddle 上的演示


0
投票

我不确定您将如何执行查询?但是,如果您可以设法创建动态 SQL 查询字符串来查找所有重复行,并将每行插入到临时表中,并将其他值(唯一)插入到单独的临时表中。然后创建另一个查询将所有临时表(具有重复的)值连接到一个新的数据集中,将所有这些值与(唯一的)数据集联合起来。

这可能是一个很长而且不是一个好的解决方案,但这是我的实验:

  1. 将所有重复行插入#temp 表(3 行= 3 #temp 表)

    选择 ID、姓名
    进入#temp1
    来自测试表
    WHERE 名称='ABC'

    选择 ID、姓名 进入#temp2 来自测试表 名称='XYC'

    选择 ID、姓名 进入#temp3 来自测试表 WHERE 名称='FGH'

  2. 将所有唯一行插入单个#temptable
    选择 ID、姓名
    进入#temp4
    来自测试表
    哪里 Id!=123
    
  3. 查询
    选择 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
    
  4. 结果

0
投票

如果您想要三个不同的列,您可以使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.