Postgresql

將兩行分成兩列

  • June 28, 2020

我有下表:

id   | name   | action | count
------------------------------
1   | Value1 |    0   | 27
1   | Value1 |    1   | 49
2   | Value2 |    0   | 7
2   | Value2 |    1   | 129
3   | Value3 |    0   | 9
3   | Value3 |    1   | 7

我需要讓“動作”列出現兩次,其中包含每行的計數值,如下所示:

id   | name   | action1 | action2
---------------------------------
1   | Value1 |    27   | 49
2   | Value2 |    7    | 129
3   | Value3 |    9    | 7

我怎樣才能做到這一點?這是我的腳本:

SELECT m.id,
   t.name,
   m.action,
   count(m.id) AS count
FROM table1 m
LEFT JOIN table2 t ON (m.id = t.id)
WHERE m.status != '2'
GROUP BY m.id,
   t.name,
   m.action
ORDER BY 1, 3

您可以使用條件聚合:

select m.id, 
      t.name, 
      count(case when m.action = 0 then m.id end) as action1,
      count(case when m.action = 1 then m.id end) as action2
from table1 m
 left table2 t ON (m.id = t.id)
where m.status <> '2'
group by m.id, t.name;

在即將發布的 9.4 版本中,count(case(...))可以使用新的“過濾”聚合寫得更短一些:count(id) filter (when m.action = 0)

引用自:https://dba.stackexchange.com/questions/71556