1

私は SQL や SQLITE に精通していません。

単純な選択および結合ステートメントを実行しています。私は基本的にsqlite3データベースから連絡先を引き出し、手動でcsvにダンプしています。

私が直面している問題は、あるテーブルに名前と ID があり、別のテーブルに電話番号とラベルがあることです。ここで、ラベルは「モバイル」、「仕事」などを意味します。

だから私は名前のID =電話番号の所有者IDに参加しています。

私が見つけたのは (そしてこれは完全に理にかなっています)、1 人の人に 3 つの電話番号がある場合、その 1 人は 3 回現れるということです。

いいえ:

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
[...]
4

2 に答える 2

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
于 2013-01-12T02:22:21.837 に答える
1

次の 2 つのオプションがあります。

  1. データをそのまま Excel にコピーし、この質問の解決策を適用します。

  2. Phonesテーブルに一意の ID がある場合に機能する、わずかに異なる SQL を使用して実行します。

    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
    )
    
于 2013-01-11T22:42:35.983 に答える