如何为以下结果创建 SQL 语句?
How to create SQL statement for the following result?
我有一个 table,内容如下 -
我正在尝试创建 4 列,如下所示 -
- 风险
- Risk_Count
- 收入
- Revenue_Count
以下 SQL 查询为我提供了所需的 4 列,但它也生成了 NULL 值。
select CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then BUCKET end as Revenue,
CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then CUSTOMER_COUNT end as Revenue_count,
CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then BUCKET end as Risk,
CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME"
结果-
如何删除 NULL 值并将结果放在一行中,以便理想情况下输出应包含 3 行 4 列。
此致
你想要 SUM()
或 MAX()
:
select MAX(CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then BUCKET end) as Revenue,
MAX(CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then CUSTOMER_COUNT end) as Revenue_count,
MAX(CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then BUCKET end) as Risk,
MAX(CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk') then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME"
然后你可以使用IN
或LIKE
来简化逻辑:
select max(case when "BUCKET" in ('High Revenue', 'Low Revenue', 'Medium Revenue') then BUCKET end) as Revenue,
max(case when "BUCKET" in ('High Revenue', 'Low Revenue', 'Medium Revenue') then CUSTOMER_COUNT end) as Revenue_count,
max(case when "BUCKET" in ('High Risk', 'Low Risk', 'Medium Risk') then BUCKET end) as Risk,
max(case when "BUCKET" in ('High Risk', 'Low Risk', 'Medium Risk') then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME";
我还建议您去掉标识符周围的双引号。仅在确实需要时引用标识符 -- 然后选择不需要引用的标识符(例如您拥有的标识符)。
编辑:
我想你想要:
select max(case when bucket like '%Revenue' then BUCKET end) as Revenue,
max(case when bucket like '%Revenue' then CUSTOMER_COUNT end) as Revenue_count,
max(case when bucket like '%Risk' then BUCKET end) as Risk,
max(case when bucket like '%Risk' then CUSTOMER_COUNT end) as Risk_count
FROM "TABLE_NAME"
GROUP BY LEFT(bucket, 3) -- sufficient to distinct high/medium/low
您可以使用 UNION 执行此操作:
select
'High Revenue' REVENUE,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'High Revenue') REVENUE_COUNT,
'High Risk' RISK,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'High Risk') RISK_COUNT
union all
select
'Medium Revenue' REVENUE,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Medium Revenue') REVENUE_COUNT,
'Medium Risk' RISK,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Medium Risk') RISK_COUNT
union all
select
'Low Revenue' REVENUE,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Low Revenue') REVENUE_COUNT,
'Low Risk' RISK,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Low Risk') RISK_COUNT
您可以使用聚合和 max() 来获得所需的结果,因为您不能在字母数字字段上使用 sum() - 它会引发错误。
select Revenue, Revenue_Count, Risk, Risk_Count from
(
select
case
when bucket like 'High%' then 1
when bucket like 'Low%' then 2
else 3
end,
max(case when bucket like '%Revenue%' then bucket else null end) as Revenue,
max(case when bucket like '%Revenue%' then customer_count else null end) as Revenue_Count,
max(case when bucket like '%Risk%' then bucket else null end) as Risk,
max(case when bucket like '%Risk%' then customer_count else null end) as Risk_Count
from public.table_name
group by
case
when bucket like 'High%' then 1
when bucket like 'Low%' then 2
else 3
end
order by 1
) x;
我有一个 table,内容如下 -
我正在尝试创建 4 列,如下所示 -
- 风险
- Risk_Count
- 收入
- Revenue_Count
以下 SQL 查询为我提供了所需的 4 列,但它也生成了 NULL 值。
select CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then BUCKET end as Revenue,
CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then CUSTOMER_COUNT end as Revenue_count,
CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then BUCKET end as Risk,
CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME"
结果-
如何删除 NULL 值并将结果放在一行中,以便理想情况下输出应包含 3 行 4 列。
此致
你想要 SUM()
或 MAX()
:
select MAX(CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then BUCKET end) as Revenue,
MAX(CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then CUSTOMER_COUNT end) as Revenue_count,
MAX(CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then BUCKET end) as Risk,
MAX(CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk') then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME"
然后你可以使用IN
或LIKE
来简化逻辑:
select max(case when "BUCKET" in ('High Revenue', 'Low Revenue', 'Medium Revenue') then BUCKET end) as Revenue,
max(case when "BUCKET" in ('High Revenue', 'Low Revenue', 'Medium Revenue') then CUSTOMER_COUNT end) as Revenue_count,
max(case when "BUCKET" in ('High Risk', 'Low Risk', 'Medium Risk') then BUCKET end) as Risk,
max(case when "BUCKET" in ('High Risk', 'Low Risk', 'Medium Risk') then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME";
我还建议您去掉标识符周围的双引号。仅在确实需要时引用标识符 -- 然后选择不需要引用的标识符(例如您拥有的标识符)。
编辑:
我想你想要:
select max(case when bucket like '%Revenue' then BUCKET end) as Revenue,
max(case when bucket like '%Revenue' then CUSTOMER_COUNT end) as Revenue_count,
max(case when bucket like '%Risk' then BUCKET end) as Risk,
max(case when bucket like '%Risk' then CUSTOMER_COUNT end) as Risk_count
FROM "TABLE_NAME"
GROUP BY LEFT(bucket, 3) -- sufficient to distinct high/medium/low
您可以使用 UNION 执行此操作:
select
'High Revenue' REVENUE,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'High Revenue') REVENUE_COUNT,
'High Risk' RISK,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'High Risk') RISK_COUNT
union all
select
'Medium Revenue' REVENUE,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Medium Revenue') REVENUE_COUNT,
'Medium Risk' RISK,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Medium Risk') RISK_COUNT
union all
select
'Low Revenue' REVENUE,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Low Revenue') REVENUE_COUNT,
'Low Risk' RISK,
(select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Low Risk') RISK_COUNT
您可以使用聚合和 max() 来获得所需的结果,因为您不能在字母数字字段上使用 sum() - 它会引发错误。
select Revenue, Revenue_Count, Risk, Risk_Count from
(
select
case
when bucket like 'High%' then 1
when bucket like 'Low%' then 2
else 3
end,
max(case when bucket like '%Revenue%' then bucket else null end) as Revenue,
max(case when bucket like '%Revenue%' then customer_count else null end) as Revenue_Count,
max(case when bucket like '%Risk%' then bucket else null end) as Risk,
max(case when bucket like '%Risk%' then customer_count else null end) as Risk_Count
from public.table_name
group by
case
when bucket like 'High%' then 1
when bucket like 'Low%' then 2
else 3
end
order by 1
) x;