如何制作一个 sql 视图,其中每一行都是查询的结果?

How to make a sql view where each row is the result of a query?

我目前正在研究 PostgreSQL 版本 14。 我有两个 table,一个是电子邮件列表,另一个描述这些电子邮件是否无效或被标记为取消订阅 (black_list)。我想使用视图在同一 table 的两个不同行中确定有多少地址无效和取消订阅的百分比。

我的邮箱table

| email_id | email|
|:---- |:------:|
| 1| bob.smith@yahoo.com|
| 2| ronald.gregor@gmail.com|
| 3| jo123456@gmail.com|

我的 table black_list 看起来像那样。

email_id unsubscribe invalid
1 True False
3 False True

我期待的结果。

categories value
unsubscribe 33
invalid 33

我试图用这个查询创建一个视图:

CREATE OR REPLACE VIEW percentage_unsubscribe (value) AS SELECT (SELECT COUNT(*) 
FROM black_list WHERE unsubscribe = True)/(SELECT COUNT(*) FROM email_table

但是我想知道如何传递分类列和第二行。

使用 union 生成两行,使用 with 语句稍微优化查询并使其更具可读性,例如:

create or replace view percentage_unsubscribe (category, value) as 
    with totals as (
        select
            count(*) filter (where unsubscribe) as unsubscribe,
            count(*) filter (where invalid) as invalid,
            (select count(*) from email_table) as total
        from black_list
    )
    select 'unsubscribe', unsubscribe* 100/ total
    from totals
    union
    select 'invalid', invalid* 100/ total
    from totals;