PostgreSQL_行转列(filter用法)

行列转换,不是很统一,有的地方叫转置,有的地方叫透视

停车表中车位共有四种状态,0(未绑定区域)、1(绑定区域、也代表空闲)、2(有车)、3(异常)

idstreetstatuscount
41010503A13
41017206B11
41017206B22
41017206B31
41017240C00
41017240C12
41017240C22
41017240C31

前端展示时候需要展示出总车位(0、1、2、3)、在用(2、3)、空余(0、1)

对应的表格为status0(空闲)、status1(在用)、status(总车位)

idstreetstatus0status1status
41010503A100
41017206B134
41017240C235

实现过程

传统的case when语法。在PostgreSQL中,还提供了一个filter语法(简化case when)

SELECT T11.id AS id,street,status0,status1,T11.status,
       T22.cameraid,T22.name,T22.url,T22.location,
       CASE  WHEN status1=T11.status AND status0!=0        THEN '2'
             WHEN status0< status1                         THEN '1'
             ELSE  '0'
       END AS flag
  FROM(
     SELECT  id,street,
     COALESCE(SUM(count) FILTER (WHERE status=0 OR status=1            ),0) AS "status0",
     COALESCE(SUM(count) FILTER (WHERE             status=2 OR status=3),0) AS "status1", 
     COALESCE(SUM(count) FILTER (WHERE 1=1                             ),0) AS "status" 
     FROM (SELECT T1.id,T1.name AS street,T2.status,COUNT(*)         
            FROM(SELECT *  FROM "street" )T1
       LEFT JOIN(SELECT streetid,status FROM "parkingplace" )T2 ON T1.id = T2.streetid
         GROUP BY T1.id,T1.name,T2.status 
           )T  GROUP BY id,street
       )T11
LEFT JOIN (SELECT T2.streetid,T3.location,T3.url,T3.cameraid,T3.name
             FROM (SELECT *  FROM "parkingplace" )T2
        LEFT JOIN (SELECT parkingid,T22.location,T22.url,T22.id AS cameraid,T22.name
                     FROM "cameraarea" T11
                LEFT JOIN "camera" T22 ON T11.cameraid = T22.id
                   )T3 ON T2.id=T3.parkingid WHERE T3.location <> ''                             GROUP BY T2.streetid,T3.location,T3.url,T3.cameraid,T3.name 
          )T22 ON T11.id=T22.streetid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值