2016-11-07 18 views
1

を結合します。は、私はこのような2つのクエリをしている2つのクエリのpostgresのの結果

ユーザーが、一つだけこののを持つことができますので、基本的にuser_ipNullであるならば、user_iduser_idNull であるならば、user_ipが値を持つことになります値と反対になります。

私が望むのは、それらのクエリを1つのクエリにすることだけです。

最初のクエリは、これを与える:

project_id | user_ip | Count    
    1  | 1.2.3.4 | 40   
    2  | 1.2.3.5 | 25  
    3  | 1.2.3.6 | 9   
    4  | 1.2.3.7 | 7 

第二はこれを与える:

project_id | user_id | Count    
    1  | 1234 | 100   
    2  | 4567 | 50  
    3  | 4321 | 49 

だから私はこれを返します唯一のクエリを作りたい:

project_id | user_id | user_ip | Count    
    1  | 1234 |   | 100 
    1  |   | 1.2.3.4 | 40  
    2  | 4567 |   | 50 
    2  |   | 1.2.3.5 | 25  
    3  | 4321 |   | 49 
    3  |   | 1.2.3.6 | 9   
    4  |   | 1.2.3.7 | 7 

私は私は連合でそれをやろうとしましたが、私はERRORを受け取りました:UNION types text and integer cannot be matched

SELECT project_id, user_ip, count(*) AS Count 
FROM "user" 
WHERE user_ip IS NOT NULL 
GROUP BY user_ip, project_id 
UNION 
SELECT project_id, user_id, count(*) AS Count 
FROM "user" 
WHERE user_id IS NOT NULL GROUP 
BY user_id, project_id; 

私が望む結果を達成するのに助けてくれる人はいますか?何が使えますか?

答えて

0

NULL as user_id/ipをSELECT節に追加してください。また、代わりに労働組合、group by project_id, user_id, user_ipを試してみてください

SELECT project_id, NULL as user_id, user_ip, count(*) AS Count ... 
union 
SELECT project_id, user_id, NULL as user_ip, count(*) AS Count 

、それはあまりにも動作するはずです。これはもっと速いかもしれません。

SELECT project_id, user_id, user_ip, count(*) AS Count 
FROM "user" 
GROUP BY project_id, user_id, user_ip; 
+0

私はこのようなグループで試しました。 'SELECT project_id、user_ip、count(user_ip)AS Count_ip、count(user_id)count_id FROM" user "WHERE user_idがNULLでないかuser_ip IS NOT NULL GROUP BY user_id、project_id、user_ip;'私はそれが私に間違った結果を与えるので、私はそれを働かせることができませんでした –

+0

多分ちょうど単一のカウント(*)で試してみてください。また、user_idとipの両方がNULLの場合がなければ、WHERE句は必要ありません。私は完全な質問で答えを更新します – dimm

0

まず、union allを使用します。第二に、1は数およびその他の文字列です...値をテキストに変換:

SELECT project_id, user_ip::text, count(*) AS Count 
FROM "user" 
WHERE user_ip IS NOT NULL 
GROUP BY user_ip, project_id 
UNION ALL 
SELECT project_id, user_id::text, count(*) AS Count 
FROM "user" 
WHERE user_id IS NOT NULL 
GROUP BY user_id, project_id; 

あなたはまた、Postgresの9.5以降でGROUPING SETSを使用して、これを書くことができます。

SELECT project_id, COALESCE(user_ip::text, user_id::text), 
     count(*) AS Count 
FROM "user" 
WHERE user_ip IS NOT NULL 
GROUP BY GROUPING SETS ((project_id, user_ip), (project_id, user_id)) 
+0

おかげで、私はこれを取得: 'ERROR:構文エラーまたはその近くには、' –

+0

@Egjupss "を設定します"。 。 。私の悪い。これはPostgres 9.5以降でのみ利用可能です。 –

1

組合の必要性のクエリすべての列の数とタイプが同じであること。これを試してください:

SELECT project_id, user_ip, null as user_id, count(*) AS Count FROM "user" WHERE user_ip IS NOT NULL GROUP BY user_ip, project_id 
UNION 
SELECT project_id, null as user_ip, user_id, count(*) AS Count FROM "user" WHERE user_id IS NOT NULL GROUP BY user_id, project_id; 
0

Grouping sets(9.5以降)あなたの答えのための

select * 
from (
    select project_id, user_id, user_ip, count(*) 
    from "user" 
    group by grouping sets ((project_id, user_id), (project_id, user_ip)) 
) s 
where user_id is not null or user_ip is not null 
関連する問題