在 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_1
和 event_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
对数据进行逆透视。然后使用条件聚合计算 m
和 f
:
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.
背景
请原谅这个问题的标题,因为我不太确定如何描述我正在尝试做的事情。
我有一个 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_1
和 event_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
对数据进行逆透视。然后使用条件聚合计算 m
和 f
:
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.