2017-09-05 29 views
0

我有這個查詢,結果是多行,每一行都是一個事件和他各自的計數值。如何將多行中返回的所有COUNT加入單行(POSTGRESQL)

SELECT u.name, l.event, COUNT (l.event) 
FROM log AS l LEFT JOIN user AS u ON u.id = l.userid 
GROUP BY u.name, l.event 

結果是這樣的:

------------------------------------------ 
| user | event | count | 
------------------------------------------ 
| user_1  | event_1  | 12   | 
| user_1  | event_2  | 6   | 
| user_1  | event_3  | 9   | 
| user_2  | event_1  | 16   | 
| ...  | ...   | ...   | 

的問題是,我需要在一個單一的結果行,其中每一行代表一個單獨的用戶,這些數作爲參數(列),像這樣:

-------------------------------------------------------------- 
| user | event_1 | event_2 | event_3 | 
-------------------------------------------------------------- 
| user_1  | 12   | 6    | 9    | 
| user_2  | 16   | 0    | 13   | 
| ...  | ...   | ...   | ...   | 

也許我可以做一個選擇查詢?用某種函數做循環或類似的東西?

謝謝!

編輯1:我不知道這個事件,他們寫的代碼

編輯2:我看到有一個簡單的SQL查詢來做到這一點非同小可的方式,所以我使用Python與大熊貓做這個。參加How to convert a column of string to numerical?

+0

您可以使用PIVOT。我有類似的問題。在e.event領域的PIVOT。然而,在我爲你編寫代碼之前,需要重新學習我的語法。 –

+0

搜索交叉表。這個查詢的使用者是誰?輸出json是讓它完全動態的簡單方法。可以輸出json嗎? –

回答

0

看看如果你知道的事件,您可以使用條件彙總:

SELECT name, 
     MAX(CASE WHEN event = 'event_1' THEN cnt ELSE 0 END) as event_1, 
     MAX(CASE WHEN event = 'event_2' THEN cnt ELSE 0 END) as event_2, 
     MAX(CASE WHEN event = 'event_3' THEN cnt ELSE 0 END) as event_3 
FROM (SELECT u.name, l.event, COUNT(l.event) as cnt 
     FROM user u LEFT JOIN 
      log l 
      ON u.id = l.userid 
     GROUP BY u.name, l.event 
    ) ul 
GROUP BY name; 

我切換LEFT JOIN。即使沒有匹配的日誌消息,您似乎更希望保留所有用戶。

+0

不幸的是我不知道這些事件,實際上數據庫中大約有80個事件。無論如何,左連接的提示是非常有用的,謝謝。 –

0

試試這個,看看它是否工作..

Select [event_1],[event_2],[event_3] from 

(SELECT u.name, l.event FROM log AS l LEFT JOIN user AS u ON u.id = l.userid) s1 

PIVOT (COUNT(l.event) FOR u.name in ([event_1],[event_2],[event_3])) as p1 
+0

實際上和不幸的是,這是大約80個事件,我不知道他們寫在代碼中。但我從來沒有使用函數PIVOT之前,我會看看,謝謝 –

+0

這個問題被標記爲Postgresql而不是SQL Server。 –

+0

酷男@ClodoaldoNeto –