无需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;
逻辑说明:
- CTE部分:通过
ROW_NUMBER()窗口函数,为每个OrderID下的产品分配唯一序号(按产品名称排序),区分同一订单内的不同产品行。 - 聚合查询部分:使用
MAX(CASE ...)的条件聚合方式,将不同序号的产品信息分别映射到单独的列中。GROUP BY订单相关的唯一字段(订单ID、创建时间、状态),确保每个订单只返回一行。
注意事项:
- 数据库不允许重复列名,因此示例中用
ProductName1、ProductName2区分不同产品列,替代你需求中的重复列名(重复列名在SQL中是非法的)。 - 如果订单下的产品数量超过2个,只需继续添加对应序号的
CASE语句即可(比如ProductName3、SKU3等)。
内容的提问来源于stack exchange,提问作者Tyler Schaffer
相关产品推荐
相关产品推荐

