【发布时间】:2022-06-15 01:19:01
【问题描述】:
表1
| customerid | jan21 | feb21 | mar21 | apr21 |
|---|---|---|---|---|
| 123 | 1 | 0 | 0 | 1 |
| 124 | 0 | 1 | 0 | 1 |
| 125 | 0 | 0 | 1 | 1 |
| 126 | 1 | 1 | 0 | 1 |
我有一个如上所述的表,我想创建另一个这样的表:
表2
| month | jan21 | feb21 | mar21 | apr21 |
|---|---|---|---|---|
| jan21 | 2 | 0 | 0 | 2 |
| feb21 | - | 2 | 0 | 2 |
| mar21 | - | - | 1 | 2 |
| apr21 | - | - | - | 4 |
基本上,我想计算每个月有多少客户是活跃的,条件是他们在给定月份是活跃的。
我把桌子的左侧留空,因为它将是右侧的对称,但如果有人可能会提出一个解决方案填充桌子的两侧,它仍然非常受欢迎。
我用很多子查询和 WHERE 条件来做这件事,我每个月都会通过每次更改每个月的 where 条件来求和。但是,它非常耗时,我想知道是否有一次性 SQL 查询来完成这项任务。
顺便说一句,我正在研究 POSTGRESQL。
这是我的查询。我还在查询中创建 table1。
我每个月都会更改jan21 = 1
select
sum(jan21) as jan21,
sum(feb21) as feb21,
sum(mar21) as mar21,
sum(apr21) as apr21
from(
select customerid,
sum(jan21) as jan21,
sum(feb21) as feb21,
sum(mar21) as mar21,
sum(apr21) as apr21
from (
with orders as (
select customerid, to_char(orderdate, 'YYYYMM') as orderdate
from ordertable
group by customerid, orderdate
)
select distinct customerid,
case
when orderdate = '202101' then 1 else 0 end as jan21,
case
when orderdate = '202102' then 1 else 0 end as feb21,
case
when orderdate = '202103' then 1 else 0 end as mar21,
case
when orderdate = '202104' then 1 else 0 end as apr21
from orders
) t1 group by customerid
) t25
where jan21 = 1
【问题讨论】:
-
你能分享你在这个问题上的编码尝试吗?也许这可能是改进解决方案的一个很好的起点。
-
我添加了我的工作@lemon
标签: sql postgresql subquery pivot-table