2017-01-09 7 views
0

異なる列に個別のエントリに基づいてカウントがTXNテーブルのスキーマである -のPostgreSQL:以下

ID | SrcNO | DstNO | SrcCountry | DstCountry | Type | 
    1  A   B   USA   UK   RECV 
    2  A   B   USA   UK   RECV 
    3  B   H   UK   IND  SEND 
    4  C   D   UK   GER  SEND 

目的は、他の国に英国のSrcNO/DstNoからtxnsのカウントをキャプチャすることです。 GERとCとBのための任意のTXNセンド/ RECVがないとして -

No | Country | Send | RECV 
    B  USA  0  2 
    B  IND  1  0 
    B  GER  0  0 
    C  USA  0  0 
    C  IND  0  0 
    C  GER  1  0 

備考 - 言い換えれば、私はグループに英国がそれぞれSrcCountry/DstCountry任意のSrcNo/DstNoですTXN年代のカウントをしたいですUSA、INDでは、SEND/RECVの両方の場合にカウントを0として表示する必要があります。

ご協力いただければ幸いです。

+0

「C」、「H」、「D」の「いいえ」の値はどうなりましたか? –

答えて

0

方法について:

select country, No, sum(send) as send, sum(recv) as recv 
from ((select srcCountry as country, dstNo as No, 1 as send, 0 as recv 
     from t 
     where dstCountry = 'UK' and type = 'SEND' 
    ) union all 
     (select srcCountry as country, dstNo as No, 0 as send, 1 as recv 
     from t 
     where dstCountry = 'UK' and type = 'RECV' 
    ) union all 
     (select destCountry as country, dstNo as No, 1 as send, 0 as recv 
     from t 
     where srcCountry = 'UK' and type = 'SEND' 
    ) union all 
     (select dstCountry as country, dstNo as No, 0 as send, 1 as recv 
     from t 
     where srcCountry = 'UK' and type = 'RECV' 
    ) 
    ) c 
group by country, no; 

私は、これはあなたが本当にそれらの必要がある場合は、すべての値が0である国をスキップします、あなたはサブクエリで余分な行を含めることができることに注意してください。しかし、「H」のNoの行がどうなったかはわかりません。本当に欲しいものは不明です。

+0

私はHに対応するデータは望ましくありません。Hはインドに属するDstNoです。私の懸念事項は、英国のSrcNoとDstNoです。 – davyjones

0

使用して簡単なのCTE:

WITH config (c) AS (SELECT 'UK'::varchar), 
countries (country) AS (
    SELECT srccountry FROM t WHERE srccountry NOT IN (SELECT c FROM config) 
    UNION 
    SELECT dstcountry FROM t WHERE dstcountry NOT IN (SELECT c FROM config) 
), 
nos (no) AS (
    SELECT srcno FROM t WHERE srccountry IN (SELECT c FROM config) AND type = 'SEND' 
    UNION 
    SELECT dstno FROM t WHERE dstcountry IN (SELECT c FROM config) AND type = 'RECV' 
), 
send (no, country, send) AS (
    SELECT srcno, dstcountry, COUNT(*) 
    FROM config LEFT JOIN t ON srccountry = c 
    GROUP BY srcno, dstcountry 
), 
recv (no, country, recv) AS (
    SELECT dstno, srccountry, COUNT(*) 
    FROM config LEFT JOIN t ON dstcountry = c 
    GROUP BY dstno, srccountry 
) 
SELECT no, country, COALESCE(send, 0) AS send, COALESCE(recv, 0) AS recv 
FROM countries 
CROSS JOIN nos 
LEFT JOIN send USING (no, country) 
LEFT JOIN recv USING (no, country); 
  • 設定「表」があるだけで、クエリ内の別の場所で、英国を変更する必要はありませんように。
  • 国 "テーブル"は、イギリス(またはあなたが設定した国)とは異なる国をすべて検索します。
  • nos "table"は、UKが送受信したすべての番号を取得します。
  • 送信 "テーブル"は、イギリスから(そして受信した)各製品の番号をカウントします。
  • recv「テーブル」は、イギリスが受け取った(そして誰がそれを送った)各製品の数を数えます。
  • 最後のクエリでこれらの結果がすべて結合されます。