2017-01-09 96 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的計數。換句話說,我希望將TXN的的計數,其中英國是SrcCountry/DstCountry任何SrcNo/DstNo分別 -

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 

備註 - 由於沒有對於B與GER和C任何TXN發送/ recv的與美國,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

使用簡單的熱膨脹係數:

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」檢索英國發送或接收的所有nos;
  • 發送「表」計算英國(以及誰收到)發送的每件產品的數量;
  • recv「table」統計英國(以及誰發送的)每件產品的數量;
  • 最終查詢加入所有這些結果。