我的数据库中有一些数据。我试图进行检索,它应该以这种方式出现。
当前表:
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的列中。
答案 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`