如何使用sql语句实现我想要的结果?

时间:2016-11-30 09:12:43

标签: mysql sql

我的数据库中有一些数据。我试图进行检索,它应该以这种方式出现。

当前表:

FName| lName | phoneNo | year
Tom  | Tan   | 9123456 | 1  
Tom  | Tan   | 9012345 | 1 <----extra row

我想要的是什么:

FName | lName| phoneNo| year | phoneNo2
Tom   | Tan  | 9123456| 1    |9012345

如何使用sql语句实现此目的?

我想看看FName和lName是否重复,然后将复制的数据组合起来,phoneNo将被添加到一个名为phoneNo2的列中。

2 个答案:

答案 0 :(得分:1)

执行GROUP BY,使用MIN()获取第一个phoneno,使用MAX()获取第二个。

select FName, lName, min(phoneNo), max(year), max(phoneNo)
from tablename
group by FName, lName

您也可以自我LEFT JOIN

select t1.FName, t1.lName, t1.phoneNo, t1.year, t2.phoneNo
from tablename t1
left join tablename t2
    on t1.FName = t2.FName and t1.lName = t2.lName
    and t1.phoneNo < t2.phoneNo

注意:根据ANSI SQL YEAR是保留字,因此您可能需要将其分隔为"year"

答案 1 :(得分:0)

另一个可以处理2个以上电话号码的选项是使用GROUP_CONCAT

SELECT FName, 
    lName,
    SUBSTRING_INDEX(GROUP_CONCAT(phoneNo), ',', 1) AS phoneNo, 
    `year`, 
    IF(COUNT(phoneNo) >= 2, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(phoneNo), ',', 2), ',', -1), NULL) AS phoneNo2, 
    IF(COUNT(phoneNo) >= 3, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(phoneNo), ',', 3), ',', -1), NULL) AS phoneNo3, 
    IF(COUNT(phoneNo) >= 4, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(phoneNo), ',', 4), ',', -1), NULL) AS phoneNo4, 
    IF(COUNT(phoneNo) >= 5, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(phoneNo), ',', 5), ',', -1), NULL) AS phoneNo5 
FROM tablename
GROUP BY FName, 
        lName,
        `year`