我不熟悉SQL或SQLITE。
我正在运行一个简单的select和join语句。我基本上是从sqlite3数据库中提取联系人并手动转储到csv中。
我遇到的问题是,我在一个表中有姓名和ID,在另一个表中有电话号码和标签。其中,标签的意思是“移动”,“工作”等。
所以我加入名称ID =电话号码所有者ID的地方。
我所发现的(这是完全合理的)是,如果我有一个人的三个电话号码,那么一个人会出现三次。
IE:
John Doe, 123-123-1234, Home, someInc
John Doe, 123-123-4321, Mobile, someInc
John Doe, 123-456-3214, Work, someInc
现在..我如何通过实际的SQL语句本身得到更像这样的结果:
John Doe, 123-123-1234, Home, someInc
123-123-4321, Mobile, someInc
123-456-3214, Work, someInc
Foo Barr, 987-654-3211, Home, anotherInc
[...]
答案 0 :(得分:3)
也许你想要压扁桌子:
select n.name,
max(case when p.label = 'home' then p.phonenumber end) as PhoneHome,
max(case when p.label = 'work' then p.phonenumber end) as PhoneWork,
max(case when p.label = 'mobile' then p.phonenumber end) as PhoneMobile
from names n join
phones p
on n.nameid = p.nameid
group by n.name
这会将每种类型的电话号码放在一个单独的列中。您需要研究所有不同的标签以获得正确的列。
您还可以将所有电话号码放入一个字段,例如" home:0001112222,work:33344455555:
select n.name,
group_concat(p.tag||':'||p.phonenumber) as AllNumbers
from names n join
phones p
on n.nameid = p.nameid
group by n.name
答案 1 :(得分:1)
有两种选择:
将数据按原样复制到Excel并应用this question中的解决方案。
使用略有不同的SQL执行此操作,如果您的Phones
表上有一些唯一ID,则可以使用
SELECT
CASE t.rank WHEN 1 THEN t.Name ELSE '' END as Name,
t.Phone,
t.Work
FROM (
SELECT t.*,
(
SELECT COUNT(*)
FROM yourTable ti
WHERE t.phoneID >= ti.phoneId
) AS rank
FROM yourTable t
ORDER BY phoneID
)