postgresql - 使用两列作为行数据来透视 PostgreSQL 中的数据

标签 postgresql group-by

在 PostgreSQL 中,我有一个表 country 和一个表 property。一个国家可以拥有很多属性(property)。每个属性都有一个 created_at。我需要按年和周计算每个国家/地区的属性。举个例子,我有一个国家的查询。

SELECT 
  EXTRACT(YEAR FROM created_at) AS yy, 
  EXTRACT(WEEK FROM created_at) AS week, 
  COUNT(id) AS country_1
FROM property 
WHERE id_country = 1
GROUP BY week, yy 
ORDER BY yy, week ASC

结果是这样的

yy  |week|country_1
---------------
2014|1   |5
2014|2   |1154
2014|3   |769
...

所以,我需要这样的结果

yy  |week|country_1|country_2|country_3
----------------------------------------
2014|1   |5        |56       |543
2014|2   |1154     |1234     |432
2014|3   |769      |123      |432
...

这可能吗?查询会怎样?

最佳答案

没有任何扩展的替代解决方案:

SELECT 
  EXTRACT(YEAR FROM created_at) AS yy, 
  EXTRACT(WEEK FROM created_at) AS week, 
  COUNT(CASE WHEN id_country = 1 THEN id ELSE null END) AS country_1,
  COUNT(CASE WHEN id_country = 2 THEN id ELSE null END) AS country_2,
  COUNT(CASE WHEN id_country = 3 THEN id ELSE null END) AS country_3,
  ...
  COUNT(CASE WHEN id_country = 7 THEN id ELSE null END) AS country_7,
FROM property 
GROUP BY week, yy 
ORDER BY yy, week ASC;

如果您使用的是 pg 9.4 或更高版本,您可以更换

COUNT(CASE WHEN id_country = 2 THEN id ELSE null END) AS country_2

COUNT(id) FILTER (WHERE id_country = 2) AS country_2

等等。

关于postgresql - 使用两列作为行数据来透视 PostgreSQL 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31943068/

相关文章:

android - 按查询分组在 ListView android 中显示一些意外结果

python - Flask-sqlalchemy - 在单个查询中对不同的组类别进行计数

python - 如何使用 GroupBy.agg() 从 TimeSeries 数据中获取 'Start' 和 'End'?

mysql - 使用sql提交的正确方法

database - Heroku运行错误

python - 使用 SQLAlchemy 的 IDE 文本选择

php - 每个 GROUP BY 的总行数

PostgreSQL:SELECT INTO - 如何创建索引?

ruby-on-rails - Ruby 2.2:PG::CharacterNotInRepertoire:错误:编码 "UTF8"的无效字节序列

sql - 分组时如何联合数组?