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

无需Pivot命令:通过SQL将重复行转置为列

解决方案:不使用Pivot实现行转列

要实现同一OrderID下的多产品行转列,我们可以通过窗口函数标记行序号 + 条件聚合的方式完成,具体修改后的SQL如下:

WITH ordered_order_items AS (
    SELECT 
        bc_order.order_created_date_time,
        bc_order.order_id, 
        bc_product.product_name,
        bc_product.sku, 
        bc_order_line_items.quantity,
        bc_order.order_status,
        -- 给每个订单下的产品按名称排序并分配序号
        ROW_NUMBER() OVER (PARTITION BY bc_order.order_id ORDER BY bc_product.product_name) AS item_sequence
    FROM BC.bc_order
    LEFT JOIN BC.bc_order_line_items 
        ON bc_order_line_items.order_id = bc_order.order_id
    LEFT JOIN BC.bc_product 
        ON bc_product.product_id = bc_order_line_items.product_id
    WHERE 
        order_status = 'Awaiting Fulfillment' 
        OR order_status LIKE 'partial%'
)
SELECT 
    order_created_date_time,
    order_id,
    -- 提取第1个产品的信息
    MAX(CASE WHEN item_sequence = 1 THEN product_name END) AS ProductName1,
    MAX(CASE WHEN item_sequence = 1 THEN sku END) AS SKU1,
    MAX(CASE WHEN item_sequence = 1 THEN quantity END) AS Quantity1,
    -- 提取第2个产品的信息
    MAX(CASE WHEN item_sequence = 2 THEN product_name END) AS ProductName2,
    MAX(CASE WHEN item_sequence = 2 THEN sku END) AS SKU2,
    MAX(CASE WHEN item_sequence = 2 THEN quantity END) AS Quantity2,
    -- 如果有更多产品,继续添加对应序号的CASE语句即可
    order_status
FROM ordered_order_items
GROUP BY 
    order_created_date_time,
    order_id,
    order_status
ORDER BY order_id;

逻辑说明:

  1. CTE部分:通过ROW_NUMBER()窗口函数,为每个OrderID下的产品分配唯一序号(按产品名称排序),区分同一订单内的不同产品行。
  2. 聚合查询部分:使用MAX(CASE ...)的条件聚合方式,将不同序号的产品信息分别映射到单独的列中。GROUP BY订单相关的唯一字段(订单ID、创建时间、状态),确保每个订单只返回一行。

注意事项:

  • 数据库不允许重复列名,因此示例中用ProductName1、ProductName2区分不同产品列,替代你需求中的重复列名(重复列名在SQL中是非法的)。
  • 如果订单下的产品数量超过2个,只需继续添加对应序号的CASE语句即可(比如ProductName3、SKU3等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:30:58