mysql合并没有唯一行的行

时间:2017-12-19 16:54:26

标签: mysql

我需要帮助将rowns合并到sql中的列:

表:

| TopologyType |拓扑名称|姓名|

| 1 |单向| client1 |
| 1 |单向| client2 |
| 2 |代理| client1 |
| 2 |代理| proxy1 |
| 2 |代理| client2 |

输出:
| 1 |单向| client1 | NULL | client2 |
| 2 |代理| client1 |代理| client2 |

2 个答案:

答案 0 :(得分:0)

Oof,你在细节方面有点啰嗦,所以不要期待这个答案在没有一些调整的情况下工作。让我给你一些样本数据:

Name, Class, Score
john, math, 70
james, math, 75
john, english, 48
james, english, 69

期望的输出:

name, mathscore, englishscore
john, 70, 48
james, 75, 69

透视mysql的查询(不支持PIVOT命令)

SELECT
  name,
  MAX(CASE WHEN class = 'math' THEN score END) as mathscore
  MAX(CASE WHEN class = 'english' THEN score END) as englishscore
FROM
  grades
GROUP BY
  name

如果您想了解它的工作原理,请在没有GROUP BY且没有MAX函数的情况下运行它:

SELECT
  name,
  CASE WHEN class = 'math' THEN score END as mathscore
  CASE WHEN class = 'english' THEN score END as englishscore
FROM
  grades

然后请记住,MAX()在执行其工作时不会考虑空值,因此会导致行折叠为仅包含值的行

顺便一提 - 看看我在提供样本数据和期望输出方面如何表达我的答案?请写下你的下一个SQL问题,包括你试过的SQL

编辑:

好的,所以只需将我的SQL中的模式应用到您的名字中即可。对我来说,"名称"是固定列,"类"是一个被转移到多个列。一般模式是:

SELECT
  fixedColumn1, 
  fixedColumn2 
  .. 
  fixedColumnN,
  MAX(CASE WHEN column_with_values_that_must_be_headers = a1_value_you_want_in_its_own_column THEN column_with_value_to_appear_as_data1) as column_header_name1,
  MAX(CASE WHEN column_with_values_that_must_be_headers = a2_value_you_want_in_its_own_column THEN column_with_value_to_appear_as_data2) as column_header_name2,
  ...
  MAX(CASE WHEN column_with_values_that_must_be_headers = aN_value_you_want_in_its_own_column THEN column_with_value_to_appear_as_dataN) as column_header_nameN
FROM
  table
GROUP BY
  fixedColumn1, 
  fixedColumn2 
  .. 
  fixedColumnN,

这是部分的;最后完成它 - 你会更多地学习这种技术,而不仅仅是等待有人给你答案粘贴:)

SELECT
 TopologyType, 
 TopologyName, 
 MAX(CASE WHEN name = 'client1' THEN name END) AS client1, 
 ... --put more CASE WHENs here
FROM
 table
GROUP BY
 TopologyType, 
 TopologyName

您的查询与我之前的示例之间唯一的细微差别是,我有一个列,我想成为标题(类的名称;英语/数学),但另一列是数据(测试分数为你是否有效地希望名称作为列标题和数据。没关系 - 只需按照上面的模式,使用名称列作为标题和数据:

 MAX(CASE WHEN name = 'client1' THEN name END) AS client1, 
               ^^^^^^^^^^^^^^^^      ^^^^
                column_header      cell_data

答案 1 :(得分:0)

如果您不需要所有输出字段都在列中,则可以使用GROUP_CONCAT

示例查询

SELECT `t`.`TopologyType`,`t`.`TopologyName`,GROUP_CONCAT(DISTINCT(`tt`.`Name`)) as `name` from `test` `t`
left join `test` `tt`
ON `t`.`TopologyType`=`tt`.`TopologyType`
GROUP BY `t`.`TopologyName`;

<强>输出

TopologyType  TopologyName       name 
     1          oneway      client1,client2
     2          proxy       client1,proxy1,client2

SQL fiddle

中查看此示例