2016-03-07 38 views
0

計爲多列我有表像下面計算行中的PostgreSQL

+---------+-----------+---------+-------------+--------+ 
| call_id | seg_order | src_dn | dst_dn_type | dst_dn | 
+---------+-----------+---------+-------------+--------+ 
| 29192 |   1 | "8004" |   0 | "2215" | 
| 29193 |   1 | "8000" |   6 | "2239" | 
| 29194 |   1 | "10001" |   6 | "8802" | 
| 29194 |   2 | "10001" |   6 | "8802" | 
| 29194 |   3 | "10001" |   4 | "8003" | 
| 29194 |   4 | "10001" |   4 | "8003" | 
| 29194 |   5 | "8003" |   0 | "2225" | 
| 29194 |   6 | "8003" |   0 | "2225" | 
| 29194 |   7 | "10001" |   0 | "2225" | 
| 29195 |   1 | "10000" |   6 | "8857" | 
| 29195 |   2 | "10000" |   6 | "8857" | 
| 29195 |   3 | "10000" |   4 | "8002" | 
| 29195 |   4 | "10000" |   4 | "8002" | 
| 29195 |   5 | "8002" |   0 | "2213" | 
| 29195 |   6 | "8002" |   0 | "2213" | 
| 29195 |   7 | "10000" |   0 | "2213" | 
| 29196 |   1 | "10002" |   6 | "8800" | 
| 29196 |   2 | "10002" |   6 | "8800" | 
| 29196 |   3 | "10002" |   4 | "8000" | 
| 29196 |   4 | "10002" |   4 | "8000" | 
| 29196 |   5 | "8000" |   0 | "2240" | 
| 29196 |   6 | "8000" |   0 | "2240" | 
| 29196 |   7 | "10002" |   0 | "2240" | 
| 29197 |   1 | "10003" |   6 | "8804" | 
| 29198 |   1 | "8000" |   0 | "2240" | 
| 29199 |   1 | "8004" |   0 | "2220" | 
| 29200 |   1 | "8004" |   0 | "2213" | 
| 29201 |   1 | "10002" |   6 | "8800" | 
| 29202 |   1 | "10003" |   6 | "8804" | 
| 29202 |   2 | "10003" |   6 | "8804" | 
| 29202 |   3 | "10003" |   2 | "8010" | 
| 29202 |   4 | "10003" |   4 | "8004" | 
| 29202 |   5 | "10003" |   4 | "8004" | 
| 29202 |   6 | "8004" |   0 | "2215" | 
| 29202 |   7 | "8004" |   0 | "2215" | 
| 29202 |   8 | "10003" |   0 | "2215" | 
+---------+-----------+---------+-------------+--------+ 

作爲結果,我需要3列包含;

  1. 「CALL_ID」 組有多少在 「src_dn」 列 「10001」
  2. 「CALL_ID」 組有多少有 「10001」 的 「dst_dn」 列
  3. 「CALL_ID」 組多少具有「當「seg_order」最大時(最後一個段)

對於第一個和第二個,「10001」應該是每組計數一個。

感謝

編輯:預期的結果

+---------+-----------+---------+ 
| inbound | outbound | ivr  | 
+---------+-----------+---------+ 
|  1 |  0 |  1 | 
+---------+-----------+---------+ 

編輯:我做了什麼至今

此查詢的工作(我相信)爲第一和第二步

select * from 
(select count(distinct call_id) from tbl where src_dn='10001') as t1, 
(select count(distinct call_id) from tbl where dst_dn='10001') as t2 
+0

可以爲您的樣品後也預期輸出你的帖子的數據? –

+0

請顯示迄今爲止您嘗試了些什麼。我們將幫助您解決您所犯的任何錯誤。 –

回答

1

我想這是你想要的東西:

SELECT 
    COALESCE((SELECT count(DISTINCT call_id) FROM tbl WHERE src_dn = '10001'), 0) AS inbound, 
    COALESCE((SELECT count(DISTINCT call_id) FROM tbl WHERE dst_dn = '10001'), 0) AS outbound, 
    COALESCE((SELECT count(DISTINCT call_id) FROM tbl WHERE dst_dn_type = 6 
     AND seg_order = (select max(seg_order) from tbl)), 0) AS outbound; 

聚結funtion是返回0。這裏你可以找到它是如何工作的:http://www.postgresql.org/docs/9.3/static/functions-conditional.html

+0

我得到「錯誤:一個子查詢返回多於一行作爲表達式」 順便說一句,所有的調用沒有相同的段數 –

+0

看到我的編輯。問題在於我使用的組。它每個call_id返回單個計數,而不是所有的call_id。對你起作用嗎? – Roland

+0

非常感謝羅蘭。我會將您的帖子標記爲解決方案。用這個 '更新你的查詢AND seg_order =(從tbl中選擇max(seg_order)作爲t2,其中t2.call_id = tbl.call_id group by call_id)' –