【问题标题】:SQL show extra row informatrion as columnsSQL 将额外的行信息显示为列
【发布时间】:2020-10-12 08:51:53
【问题描述】:

考虑下表:

User   | Device
-------+-----------
User 1 | Device 1
User 2 | Device 2
User 3 | Device 1
User 4 | Device 3

如何获取用户,在此示例中,设备 1 分别位于单独的列中?

Device 1 | User 1 | User 3
Device 2 | User 2 |
Device 3 | User 4 |

每台设备的用户数可以多于 2 个;实际上最大数量是未知的

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql tsql select pivot window-functions


【解决方案1】:

您可以使用row_number() 和条件聚合:

select
    device,
    max(case when rn = 1 then user end) user1,
    max(case when rn = 2 then user end) user2,
    ...
from (
    select t.*, row_number() over(partition by device order by user) rn
    from mtable t
) t
group by device
order by device

您可以根据需要使用更多条件表达式扩展select 子句。当给定设备的用户耗尽时,以下列显示null 值。

【讨论】:

  • 谢谢;这有点手动,但至少它给了我需要的结果!
【解决方案2】:

将数据分成不同的列很棘手 -- 除非您知道最大用户数。

通常对于此类问题,最简单的解决方案是通过连接字符串将值放入单个列中。确切的语法取决于数据库,但 SQL 标准语法是:

select device, listagg(user, ',') within group (order by user) as users
from t
group by device;

【讨论】:

  • 这很有趣,但是我得到了错误:The function 'listagg' may not have a WITHIN GROUP clause.我正在使用 SQL
  • @Fimlore 。 . .你可以把它排除在外。也就是说,您需要使用您正在使用的数据库标记您的问题。
  • 你的意思是我应该用SQL标记它吗?因为我做了.. 确切的版本是 2016;企业
  • @Fimlore 。 . . SQL 是一种语言而不是数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2015-11-15
  • 2016-04-17
相关资源
最近更新 更多