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

SQL Server 2008 R2行转列求助:禁用Pivot/Unpivot函数实现

不用Pivot/Unpivot实现SQL Server 2008 R2行转列

嘿,我懂你在SQL Server 2008 R2里卡了两天的难处——不能用Pivot和Unpivot函数,还要把原表结构转成你想要的格式,确实有点费脑。我给你整理了一个纯用UNION ALL配合CASE聚合的方案,完美适配你的需求:

先理清楚数据对应关系

先修正下你原表的排版小失误,原表应该是这样的结构(假设表名叫RatingTable):

CategoryAAAAA+AAAA-
A6.057.159.58.5
B3.024.586.257.25
C2.251.0206

你的目标是把列名(AAA、AA+等)转成No列的行值,同时把原表的行(A、B、C)转成列,对应每个评级的数值。

实现方案

核心思路分两步:

  1. 用UNION ALL把列转成行:把每个评级列(AAA/AA+/AA/AA-)拆成单独的行记录,带上对应的类别(A/B/C)和数值;
  2. 用CASE+聚合函数把行转成列:按No分组,用CASE语句匹配不同类别,提取对应的数值。

完整SQL代码如下:

-- 替换RatingTable为你的实际表名
SELECT 
    No,
    MAX(CASE WHEN Category = 'A' THEN Value END) AS A,
    MAX(CASE WHEN Category = 'B' THEN Value END) AS B,
    MAX(CASE WHEN Category = 'C' THEN Value END) AS C
FROM (
    -- 第一步:将原表的列拆成行
    SELECT 'AAA' AS No, Category, AAA AS Value FROM RatingTable
    UNION ALL
    SELECT 'AA+' AS No, Category, AA+ AS Value FROM RatingTable
    UNION ALL
    SELECT 'AA' AS No, Category, AA AS Value FROM RatingTable
    UNION ALL
    SELECT 'AA-' AS No, Category, AA- AS Value FROM RatingTable
) AS UnpivotedData
GROUP BY No
-- 保证No的顺序和期望输出一致(避免字符串排序导致顺序混乱)
ORDER BY 
    CASE No 
        WHEN 'AAA' THEN 1
        WHEN 'AA+' THEN 2
        WHEN 'AA' THEN 3
        WHEN 'AA-' THEN 4
    END;

关键细节说明

  • 为什么用MAX()?因为每个No和Category的组合只有一条记录,用MAX/MIN都能准确提取数值,不会影响结果;
  • ORDER BY里的CASE是必须的:如果直接按No字符串排序,AA+会排在AAA前面,用CASE指定顺序能和你的期望输出完全匹配;
  • 兼容SQL Server 2008 R2:整个方案没有用到Pivot/Unpivot,完全依赖基础的UNION和CASE语法,在2008 R2上可以正常运行;

执行这段代码后,就能得到你想要的输出格式啦:

NoABC
AAA6.053.022.25
AA+7.154.581.02
AA9.56.250
AA-8.57.256

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:19:54