sql - 如何在 PostgreSQL 中将行转换为列?

标签 sql postgresql sql-order-by jooq

我有如下两个数据库表

site
id    |    name
1        Site One
2        Site Two
3        Site Three

asset_quantities
id   |   site_id   |  asset_type   | quantity
1           1             1              10
2           1             2              15
3           1             3              25
4           2             1              11
5           2             2              16
6           2             3              7
7           3             1              12
8           3             2              15
9           3             3              16

我想编写一个 SQL 查询,根据给定 Assets 类型的“数量”列对结果进行排序 例如。我想根据所有站点中 Assets 类型 1 的数量对结果进行降序排序。 对于这样的场景,我将如何构建 SQL 查询?

如果我想要所有站点的 Assets 类型 1 数量的降序结果,下面是我想要的示例结果

site_id  |   asset_type_1_qty   |   asset_type_2_qty  |  asset_type_3_qty 
   3                12                     15                  16
   2                11                     16                  7
   1                10                     15                  25

最佳答案

这是一个将在 sqlserver 中执行您想要的操作的示例。你应该能够使它适应 postgres。

我有两个版本,一个对排序进行硬编码,第二个使用参数来决定排序依据。

首先在临时表变量中创建数据

declare @s table(id int, site_id int, asset_type int, quantity int)
insert @s values (1,1,1,10)
,(2,1,2,15)
,(3,1,3,25)
,(4,2,1,11)
,(5,2,2,16)
,(6,2,3,7)
,(7,3,1,12)
,(8,3,2,15)
,(9,3,3,16)

固定列排序的第一个版本

select site_id, 
    max(case when asset_type=1 then quantity else 0 end) as q1,
    max(case when asset_type=2 then quantity else 0 end) as q2,
    max(case when asset_type=3 then quantity else 0 end) as q3
from @s 
group by site_id
order by 2 desc

带参数列排序的第二个版本

declare @assetsort int;
set @assetsort=3

select * from (
    select site_id, 
        max(case when asset_type=1 then quantity else 0 end) as q1,
        max(case when asset_type=2 then quantity else 0 end) as q2,
        max(case when asset_type=3 then quantity else 0 end) as q3
    from @s 
    group by site_id
) q 
order by 
    case @assetsort when 1 then q1 when 2 then q2 when 3 then q3 end desc

关于sql - 如何在 PostgreSQL 中将行转换为列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56370929/

相关文章:

mysql - 优化多个连接 SQL

java - 为什么需要数据库代理键的 generatedKeys?

postgresql - Zend pdo_pgsql 适配器是否允许您使用 PostgreSQL 的大部分优势?

sql-server - SQL SELECT 对具有空值的列进行排序

sql - 将 select 和 value 与 insert into 一起使用

sql - MS SQL json 查询/where 子句嵌套数组项

SQL查询性能统计信息多次返回

sql - 控制到达功能结束而没有 RETURN

'order by' 不确定时的 SQL 分页

mysql - 获取表中最新行的最佳实践