2017-10-27 31 views
0

同じ問題で既にいくつかの質問がありますが、私はそれらをすべて見ていますが、解決策はまだ見つかりません。 同じ名前の列(device_id)を2つの表から結合してカウントしたいとします。Python上で同じカラム名を持つ2つのテーブルのSQL結合

列名:イベントとpythonの出力

import pandas as pd 
from sqlalchemy import create_engine # database connection 

db_engine = create_engine('sqlite:///devices-train.db') 

join_devices = pd.read_sql_query('SELECT device_id, count(device_id), gender_age_train.device_id, count(gender_age_train.device_id) FROM events JOIN gender_age_train on events.device_id = gender_age_train.device_id GROUP BY device_id', db_engine) 

print join_devices 

をgender_age_trainです:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) ambiguous column name: device_id [SQL: 'SELECT device_id, count(device_id), gender_age_train.device_id, count(gender_age_train.device_id) FROM events JOIN gender_age_train on events.device_id = gender_age_train.device_id GROUP BY device_id'] 

答えて

1

あなたが述べたように、それは両方のテーブルに表示され、以来、あなたは完全にdevice_id列を修飾する必要があります。 events.device_idgender_age_train.device_idの両方が等しいので(joinの条件に従って)選択するのは無意味であることに注意する価値があります。そのうちの一つを選択すると、十分なはずです:

SELECT e.device_id, COUNT(*) 
FROM  events e 
JOIN  gender_age_train g on e.device_id = g.device_id 
GROUP BY e.device_id 
+0

ありがとうございました!今はエラーはありませんが、出力によって私はデータについて考えるようになります。 60.865デバイスは「イベント」で利用でき、74.645デバイスは「gender_age_train」で利用可能です。しかし、どのように今参加することができます23.309? –

+1

@harun。 。 。このクエリは、2つのテーブル間で一致するデバイスのみをカウントするためです。 –

0

を接合するために使用される列が同じ名前を持っている場合、あなたはUSING clauseを使用することができます。これは入力を節約するだけでなく、結合出力から重複した列を削除して、より簡単に参照できるようにします。

SELECT device_id, COUNT(*) 
FROM  events 
JOIN  gender_age_train USING (device_id) 
GROUP BY device_id; 
関連する問題