[PG]将一行数据打散成多行数据

原始数据

      比如有如此表结构定义:

        假如查询数据如下:

select 
    dt as "日期",
    bj_count as "北京", sh_count as "上海",
    gz_count as "广州", sz_count as "深圳"
from city_stats
order by dt

---------------------------------------------------------
|    日期     |   北京    |   上海   |   广州    |  深圳   |
---------------------------------------------------------
| 2023-09-04 |   1111   |   1122   |   1133   |  1144   |
| 2023-09-05 |   2211   |   2222   |   2233   |  2244   |
| 2023-09-06 |   3311   |   3322   |   3333   |  3344   |
---------------------------------------------------------

期望效果

------------------------------------
|      日期     |   城市   |   统计  |
------------------------------------
|  2023-09-04  |   北京   |   1111  |
|  2023-09-04  |   上海   |   1122  |
|  2023-09-04  |   广州   |   1133  |
|  2023-09-04  |   深圳   |   1144  |
|  2023-09-05  |   北京   |   2211  |
|  2023-09-05  |   上海   |   2222  |
|  2023-09-05  |   广州   |   2233  |
|  2023-09-05  |   深圳   |   2244  |
|  2023-09-06  |   北京   |   3311  |
|  2023-09-06  |   上海   |   3322  |
|  2023-09-06  |   广州   |   3333  |
|  2023-09-06  |   深圳   |   3344  |
------------------------------------

解决方案

   采用笛卡尔积方式"CROSS JOIN":

select 
    s.dt as "日期", 
    c.city_name as "城市",
    c.city_count as "统计"
from city_stats as s
cross join LATERAL(
    VALUES
        (1,'北京',s.bj_count),
        (2,'上海',s.sh_count),
        (3,'广州',s.gz_count),
        (4,'深圳',s.sz_count)
) as c (city_order,city_name,city_count)
order by s.dt, c.city_order

        执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值