返回重复(ish)行。怎么消除?

时间:2013-01-11 22:09:17

标签: sql sqlite

我不熟悉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
[...]

2 个答案:

答案 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)

有两种选择:

  1. 将数据按原样复制到Excel并应用this question中的解决方案。

  2. 使用略有不同的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
    )