在 SQL 中,通过转置列结果查询 table

In SQL, query a table by transposing column results

背景

请原谅这个问题的标题,因为我不太确定如何描述我正在尝试做的事情。

我有一个 SQL table、d,看起来像这样:

+--+---+------------+------------+
|id|sex|event_type_1|event_type_2|
+--+---+------------+------------+
|a |m  |1           |1           |
|b |f  |0           |1           |
|c |f  |1           |0           |
|d |m  |0           |1           |
+--+---+------------+------------+

问题

我正在尝试编写一个查询,生成以下 event_type_1event_type_2 的计数摘要(分组?) sex:

+-------------+-----+-----+
|             |  m  |  f  |
+-------------+-----+-----+
|event_type_1 |  1  |  1  |
+-------------+-----+-----+
|event_type_2 |  2  |  1  |
+-------------+-----+-----+

问题是,这似乎涉及将 2 event_type 列转换为查询结果的行,我作为新手 SQL 用户并不熟悉。

我试过的

到目前为止,我提出了以下查询:

SELECT event_type_1, event_type_2, count(sex)
FROM d
group by event_type_1, event_type_2

但这只给我这个:

+------------+------------+-----+
|event_type_1|event_type_2|count|
+------------+------------+-----+
|1           |1           |1    |
|1           |0           |1    |
|0           |1           |2    |
+------------+------------+-----+

您可以使用 lateral join 对数据进行逆透视。然后使用条件聚合计算 mf:

select v.which,
       count(*) filter (where d.sex = 'm') as m,
       count(*) filter (where d.sex = 'f') as f
from d cross join lateral
     (values (d.event_type_1, 'event_type_1'),
             (d.event_type_2, 'event_type_2')
     ) v(val, which)
where v.val = 1
group by v.which;

Here 是一个 db<>fiddle.