2016-03-03 49 views
0
user 
--------------------------- 
| ID | Name    | 
--------------------------- 
| 1 | Jim Rice   | 
| 2 | Wade Boggs   | 
| 3 | Bill Buckner  | 
--------------------------- 

at_bats 
---------------------- 
| ID | User | Bases | 
---------------------- 
| 1 | 1 | 2  | 
| 2 | 2 | 1  | 
| 3 | 1 | 2  | 
| 4 | 3 | 0  | 
| 5 | 1 | 3  | 
---------------------- 

我想要什麼我的查詢做的就是不同基值的計數連接表所示:加入表和計算值不同的情況下

count_of_hits 
--------------------- 
| ID | 1B | 2B | 3B | 
--------------------- 
| 1 | 0 | 2 | 1 | 
| 2 | 1 | 0 | 0 | 
| 3 | 0 | 0 | 0 | 
--------------------- 

我有一個查詢我在哪裏能夠單獨獲得基地,但除非我做了一些複雜的聯合,否則不是全部,我想會有更好的方法。這雖然基本查詢:

SELECT id, COUNT(ab.*) 
FROM user 
LEFT OUTER JOIN (SELECT * FROM at_bats WHERE at_bats.bases=2) ab ON ab.user=user.id 
+0

你要轉動你的數據。 SO上有很多問題和答案。搜索「crosstab」或「pivot」。 – Patrick

+0

好的,謝謝你的幫助。 – Rob

+0

[PostgreSQL 9.3:Pivot table]的可能重複(http://stackoverflow.com/questions/28804776/postgresql-9-3-pivot-table) – Patrick

回答

1

PostgreSQL的9.4+提供更清潔的方式做到這一點:

SELECT 
    users, 
    count(*) FILTER (WHERE bases=1) As B1, 
    count(*) FILTER (WHERE bases=2) As B2, 
    count(*) FILTER (WHERE bases=3) As B3, 
FROM at_bats 
GROUP BY users 
ORDER BY users; 
1

我覺得下面的查詢會解決你的問題。但是,我不確定它是否是最好的方法:

select distinct a.users, coalesce(b.B1, 0) As B1, coalesce(c.B2, 0) As B2 ,coalesce(d.B3, 0) As B3 
    FROM at_bats a 
    LEFT JOIN (SELECT users, count(bases) As B1 FROM at_bats WHERE bases = 1 GROUP BY users) as b ON a.users=b.users 
    LEFT JOIN (SELECT users, count(bases) As B2 FROM at_bats WHERE bases = 2 GROUP BY users) as c ON a.users=c.users 
    LEFT JOIN (SELECT users, count(bases) As B3 FROM at_bats WHERE bases = 3 GROUP BY users) as d ON a.users=d.users 
    Order by users 

coalesce()函數只是用零代替空值。我希望此查詢可以幫助你:d

更新1

我發現了一個更好的辦法來做到這一點,看看下面:

SELECT users, 
count(case bases when 1 then 1 else null end) As B1, 
count(case bases when 2 then 1 else null end) As B2, 
count(case bases when 3 then 1 else null end) As B3 
FROM at_bats 
GROUP BY users 
ORDER BY users; 

它比起來,我的第一個是更有效查詢。您可以在查詢前使用EXPLAIN ANALYSE來檢查性能。 由於Guffa從這個帖子:https://stackoverflow.com/a/1400115/4453190

相關問題