【问题标题】:Select duplicated values from one coloum and get there value in one row从一列中选择重复值并在一行中获取值
【发布时间】:2020-02-12 16:08:47
【问题描述】:

我有如下两列的表格

+----------+----------+
| 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     |         |          |
+----------+---------+---------+----------+

【问题讨论】:

  • 您是否尝试创建包含多个值的多个列?
  • 查看PIVOT
  • @Nick 不,我只需要选择表中的所有值,但查看彼此并排的所有重复行,仅查看它不创建列
  • @daShier 我会检查它:)
  • @M.Zaky 试一试,如果遇到困难,请显示您的查询是什么样的,以及您得到的结果与您想要的结果。我敢肯定,有人会帮助你度过难关。

标签: mysql sql database duplicates


【解决方案1】:

如果您不想在输出中创建额外的列,您可以简单地将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

Demo on dbfiddle

【讨论】:

  • 我用过这个'|'只区分每个结果,但在 DB 上我没有这个 '|'我也会更新我的问题以明确:)
  • @M.Zaky 我明白,如果您查看查询的GROUP_CONCAT 部分,那是我插入| 的地方。如果您不想要|,您可以使用其他东西,例如,
【解决方案2】:

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

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

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

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

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

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

  2. 将所有唯一行插入单个#temptable 选择 ID、名称 进入#temp4 来自测试表 在哪里 ID!= 123
  3. 查询 选择 t1.Id,t1.Name 作为 Value1,t2.Name 作为 Value2,t3.Name 作为 Value3 从#temp1 t1 INNER JOIN #temp2 t2 on t1.Id=t2.Id INNER JOIN #temp3 t3 on t1.Id=t3.Id 联合所有 选择 t4.Id,t4.Name 作为 Value1,null 作为 Value2,null 作为 Value3 来自#temp4 t4
  4. 结果

【讨论】:

    【解决方案3】:

    如果你想要三个不同的列,你可以使用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;
    

    【讨论】:

    • 但它不是由b订购的
    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多