合并sql行中的值

时间:2014-03-20 10:06:36

标签: mysql sql merge unpivot

我正在寻找将行值合并到一行中的方法,其中要合并的列是相同的

变换:

FK | F1 
========
3  | ABC    
3  | DEF 

FK | F1    | F2
=================
3  | ABC   | DEF

更新: 我最初不知道F1​​的价值观。它们可能就是一切,但我知道它们对于给定的FK是唯一的,它们是变量。

更新2: 在你的帮助下,我来到这个查询,它还将添加只有一个值的FK。我想它可以改进。

SELECT IFNULL(jointable.FK,table。FK)AS FK,IFNULL(jointable.F1,table。F1),jointable.F2 来自table LEFT JOIN     (选择T1.FK,T1.F1,T2.F1 AS F2     来自table T1     LEFT JOIN table T2 ON T1.FK = T2.FK     在哪里T1.F1<> T2.F1     GROUP BY T1.FK     )作为连接表 ON table。FK = jointable.FK GROUP BY FK;

2 个答案:

答案 0 :(得分:2)

试试这个

SELECT FK
     , T1.F1
     , T2.F1 AS F2
FROM table T1
LEFT JOIN table T2 ON T1.FK = T2.FK AND T1.F1 <> T2.F1 --Criteria moved here

使用了LEFT JOIN,因为您提到您有一个或多个值,这意味着INNER JOIN可能最终排除了行。

第二个标准是确保您不会使用以下行:

FK | F1    | F2
=================
3  | ABC   | ABC

请注意,如果是OUTER JOINLEFTRIGHT),则加入条件与过滤条件不同,因此我将其移至上方。< / p>

在SQL Server中,您可以使用ROW_NUMBER()而不是FK,也许使用ORDER BY

在MySQL中,您可以将其与GROUP BY一起使用,如您在评论中提到的那样,我不确定它是否可行(至少在没有聚合函数或CTE的情况下不在SQL Server中)。

这是一个实时测试:http://ideone.com/Bu5aae

答案 1 :(得分:0)

建议:

SELECT FK, CONCAT(T1.F1,'',T2.F1) AS Result
FROM table T1, table T2
WHERE T1.FK = T2.FK