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

如何在SQL Server中使用PIVOT实现多列行转列操作

实现方案

你可以通过两次PIVOT完成需求,也可以使用更易理解的条件聚合语法实现,两种方法如下:

方法1:两次PIVOT实现

-- 先将你的原始查询结果放到CTE中,替换下面的原始查询逻辑
WITH OriginalData AS (
    SELECT VendorId, Category, FirstSaleDate, StoreId
    FROM 你的原表名 -- 这里替换成你原来的查询语句
)
SELECT 
    VendorId,
    Car = MAX(Car),
    StoreId_car = MAX(StoreId_car),
    Clothes = MAX(Clothes),
    StoreId_clothes = MAX(StoreId_clothes),
    Toys = MAX(Toys),
    StoreId_toys = MAX(StoreId_toys),
    Food = MAX(Food),
    StoreId_food = MAX(StoreId_food),
    Others = MAX(Others),
    StoreId_others = MAX(StoreId_others)
FROM (
    -- 第一次PIVOT转换FirstSaleDate字段
    SELECT 
        VendorId,
        Car, Clothes, Toys, Food, Others,
        -- 给StoreId拼接对应分类后缀,用于第二次PIVOT
        StoreId_col = 'StoreId_' + LOWER(Category),
        StoreId
    FROM OriginalData
    PIVOT (
        MAX(FirstSaleDate)
        FOR Category IN (Car, Clothes, Toys, Food, Others)
    ) AS PivotFirstSale
) AS TempData
-- 第二次PIVOT转换StoreId字段
PIVOT (
    MAX(StoreId)
    FOR StoreId_col IN (StoreId_car, StoreId_clothes, StoreId_toys, StoreId_food, StoreId_others)
) AS PivotStoreId
GROUP BY VendorId

方法2:条件聚合实现(更适合新手理解,性能和PIVOT一致)

SELECT
    VendorId,
    Car = MAX(CASE WHEN Category = 'Car' THEN FirstSaleDate END),
    StoreId_car = MAX(CASE WHEN Category = 'Car' THEN StoreId END),
    Clothes = MAX(CASE WHEN Category = 'Clothes' THEN FirstSaleDate END),
    StoreId_clothes = MAX(CASE WHEN Category = 'Clothes' THEN StoreId END),
    Toys = MAX(CASE WHEN Category = 'Toys' THEN FirstSaleDate END),
    StoreId_toys = MAX(CASE WHEN Category = 'Toys' THEN StoreId END),
    Food = MAX(CASE WHEN Category = 'Food' THEN FirstSaleDate END),
    StoreId_food = MAX(CASE WHEN Category = 'Food' THEN StoreId END),
    Others = MAX(CASE WHEN Category = 'Others' THEN FirstSaleDate END),
    StoreId_others = MAX(CASE WHEN Category = 'Others' THEN StoreId END)
FROM 你的原表名 -- 替换成你的原始查询语句
GROUP BY VendorId

说明

  • 如果你的原始数据分类值不固定,可以动态拼接SQL语句生成列名,避免硬编码
  • 两种方法都默认同一个VendorId下同一个Category只有一条记录,如果你有重复的分类记录,可以根据业务需求把MAX替换为MIN或者其他匹配的聚合函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:24:03