如何制作一个 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;
我目前正在研究 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;