2017-09-05 38 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 –