SELECT * FROM (SELECT x.PARENT_CLIENT ,sum(x.PS_L_AMOUNT)/100000000 as total FROM glsc_data.ti_trpt_temp_bill_his x WHERE x.beg_date::date =to_date('2023-05-24','yyyy-MM-dd') GROUP BY x.PARENT_CLIENT) s order by s.total desc limit 3 ,把这段代码做行转列操作用postgresql
时间: 2024-02-03 13:04:10 浏览: 94
可以使用PostgreSQL中的crosstab函数将行转列。需要先安装tablefunc扩展。
以下是示例代码:
```
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT PARENT_CLIENT, ''total'' AS type, sum(PS_L_AMOUNT)/100000000 AS value
FROM glsc_data.ti_trpt_temp_bill_his
WHERE beg_date::date = ''2023-05-24''
GROUP BY PARENT_CLIENT
ORDER BY value DESC LIMIT 3',
'VALUES (''total''), (''1''), (''2''), (''3'')'
) AS ct(PARENT_CLIENT TEXT, "total" NUMERIC, "1" NUMERIC, "2" NUMERIC, "3" NUMERIC);
```
解释:
1. 创建tablefunc扩展。
2. 使用crosstab函数,第一个参数是查询语句,第二个参数是列名的值(即转换后的列)。
3. 查询语句中,先查询出每个PARENT_CLIENT的总和,用AS给结果集中的每行增加一个type字段,值为total。
4. crosstab函数的输出结果包含四列:PARENT_CLIENT、total、1、2、3。其中,total列对应type为total的结果,1、2、3列分别对应排序后前三的结果。如果数据不足三条,则1、2、3列对应的值为NULL。
阅读全文