SQL - 以列值作为列名的聚合

标签 sql postgresql pivot crosstab

对于像下面这样的表格,需要进行聚合,以便对于一列中的每个唯一字段,需要找到另一列中离散值的出现次数

输入表是:

id  model  datetime     driver   distance
---|-----|------------|--------|---------
1  | S   | 04/03/2009 | john   | 399 
2  | X   | 04/03/2009 | juliet | 244
3  | 3   | 04/03/2009 | borat  | 555
4  | 3   | 03/03/2009 | john   | 300
5  | X   | 03/03/2009 | juliet | 200
6  | X   | 03/03/2009 | borat  | 500
7  | S   | 24/12/2008 | borat  | 600
8  | X   | 01/01/2009 | borat  | 700

需要输出

model  john    juliet | borat
-----|--------|-------|------
 S   | 1      | 0     |  1
 X   | 0      | 2     |  2
 3   | 1      | 0     |  1

一种可能的方法是按 model 进行分组,聚合方式如下 SUM (CASE WHEN driver = 'value' THEN 1 ELSE 0 END) AS value driver 列的每个离散值。但挑战是有时离散值的数量太多(在我的例子中大约 50 个)或者在某些情况下甚至不知道所有可能的离散值 - 我想知道是否有替代方法来做到这一点。

最佳答案

聚合部分需要多做一些工作。

这里是详细信息:

  • 需要先计算出所有的组合是什么
  • 然后使用LEFT JOIN 得到哪个组合没有数据。

DEMO

WITH "allDrivers" as (
    SELECT DISTINCT "driver"
    FROM Table1
), 
"allModels" as (
    SELECT DISTINCT "model"
    FROM Table1
), 
"source" as (
    SELECT d."driver", m."model"
    FROM "allDrivers" d
    CROSS JOIN "allModels" m
)  
SELECT s."model", s."driver", COUNT(t."datetime")
FROM "source" s 
LEFT JOIN table1 t
       ON s."model"  = t."model"
      AND s."driver" = t."driver"
GROUP BY s."model", s."driver"  

输出

| model | driver | count |
|-------|--------|-------|
|     3 |  borat |     1 |
|     3 |   john |     1 |
|     3 | juliet |     0 |
|     S |  borat |     1 |
|     S |   john |     1 |
|     S | juliet |     0 |
|     X |  borat |     2 |
|     X |   john |     0 |
|     X | juliet |     2 |

然后你可以做 dynamic pivot

关于SQL - 以列值作为列名的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39492746/

相关文章:

sql - 如何将多行合并为一行? SQL PostgreSQL 管理员

python - 是否可以将 session.insert 用于 SQLAlchemy 中的一对主要关系?

mysql - 在 SQL 查询结果中将列值设置为列名

mysql - 数据库索引在这种情况下会有帮助吗?

sql - 优化笨拙的查询

c# - 尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1

MSSQL : the KEY keyword? 中的 MySQL CREATE 语句

sql - 分组依据为空时的子查询选择

postgresql - Postgres : see query used to create materialized view?

sql - 帮我写一个 SQL 交叉表查询