2017-03-03 62 views
1

列爲了使長話短說:SQL - 計數不同值的出現次數在

我有臺這樣的

nr sat col 
1 1  dsag 
1 2  gds 
1 2  gds 
2 1  gdsa 
2 2  gf 
2 3  gdsa 

,並期望其結果是這樣的:

nr Sat_1 Sat_2 Sat_3 
1 1  2  0 
2 1  1  1 

我想從各行的新列「SELECT DISTINCT坐」和下一組由NR

+1

「長話短說」 - 你需要使用'COUNT(DISTINCT列)'和'GROUP BY NR,sat'得到的數字,和'PIVOT'得到您想要的顯示。爲了使這個短篇故事更長,請顯示你已經嘗試過。 – Siyual

回答

2

我喜歡a_horse_with_no_name的答案。這是較短的,儘管它可能會稍慢一些:

select nr, 
     sum((sat = 1)::int) as sat_1, 
     sum((sat = 2)::int) as sat_2, 
     sum((sat = 3)::int) as sat_3 
from the_table 
group by nr 
order by nr; 

編寫查詢比較典型的方式是使用case

select nr, 
     sum(case when sat = 1 then 1 else 0 end) as sat_1, 
     . . . 

這恰好是標準的SQL將在許多數據庫上運行。

+1

的'濾波器()'子句是標準的SQL以及;) –

+0

@a_horse_with_no_name有一些地方用的標準SQL特性的圖表和RDBMS支持呢?例如像你可以找到emca5/6和瀏覽器? https://kangax.github.io/compat-table/es6/ – SqlZim

+2

不是真的,我猜是因爲SQL標準是不是免費的。我所知道的唯一一個遠程類似的比較是:http://www.sql-workbench.net/dbms_comparison.html但這遠遠不夠完整,也不僅限於SQL標準中的功能。 –

6

這可以通過使用COND完成itional聚集:

select nr, 
     count(*) filter (where sat = 1) as sat_1, 
     count(*) filter (where sat = 2) as sat_2, 
     count(*) filter (where sat = 3) as sat_3 
from the_table 
group by nr 
order by nr; 

在線例如:http://rextester.com/YVIR75756

+0

是的,我知道但我不想手動完成,因爲sat列中的值比本示例中多得多。這將是完美的,如果它會爲每個不同的值 – dekarz

+0

@dekarz打造「數行」自動:你應該在你的問題已經提到。但總的來說這是不可能的。數據庫_before_執行時必須知道查詢的列數。 –

+0

我明白了。無論如何,謝謝你,這似乎是最好的答案! :)但我很失望,我無法如我所想。 – dekarz