You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Offset/Fetch将多行数据转为单行多列展示?

解决方案:单列多行转单行多列(替代Offset/Fetch方案)

Offset/Fetch本质是分页语句,只能按顺序返回指定范围的行,没法直接实现行转列的需求,而且确实无法在Offset后直接用左连接来拼接多行到同一行。你可以用行号标记+条件聚合或者PIVOT来实现目标,下面是具体实现:

方法一:条件聚合(通用所有SQL方言)

先给每行数据标记行号,再通过条件判断把不同行的Name放到对应列中:

-- 假设你的表名为Names,列名为Name
SELECT
    -- 对应第1行的Name
    MAX(CASE WHEN RowNum = 1 THEN Name END) AS Name1,
    -- 对应第2行的Name
    MAX(CASE WHEN RowNum = 2 THEN Name END) AS Name2,
    -- 对应第3行的Name
    MAX(CASE WHEN RowNum = 3 THEN Name END) AS Name3
FROM (
    -- 先给每个Name标记行号,ORDER BY可根据实际需求调整(比如按ID排序)
    SELECT 
        Name,
        ROW_NUMBER() OVER (ORDER BY Name) AS RowNum
    FROM Names
) AS NumberedNames

这里用MAX是因为每个RowNum对应唯一的Name值,聚合后只会保留该值,换成MIN效果一样。

方法二:PIVOT(适用于SQL Server、Oracle等支持PIVOT的数据库)

如果你的数据库支持PIVOT语法,可以更简洁地实现:

SELECT Name1, Name2, Name3
FROM (
    -- 生成每个Name对应的目标列名(Name1、Name2...)
    SELECT 
        Name,
        'Name' + CAST(ROW_NUMBER() OVER (ORDER BY Name) AS VARCHAR) AS ColumnName
    FROM Names
) AS SourceTable
PIVOT (
    -- 聚合函数取唯一值
    MAX(Name)
    -- 把ColumnName的值转成列
    FOR ColumnName IN (Name1, Name2, Name3)
) AS PivotTable

补充说明

  • 如果你的数据行数不固定(可能超过3行),需要用动态SQL来生成列名,但如果是固定3行,上面的静态SQL完全够用。
  • ROW_NUMBER()里的ORDER BY可以根据实际业务调整,比如按数据插入的ID排序,不一定按Name排序。

内容的提问来源于stack exchange,提问作者Boby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:01:02