SQL Server 2008 R2行转列求助:禁用Pivot/Unpivot函数实现
不用Pivot/Unpivot实现SQL Server 2008 R2行转列
嘿,我懂你在SQL Server 2008 R2里卡了两天的难处——不能用Pivot和Unpivot函数,还要把原表结构转成你想要的格式,确实有点费脑。我给你整理了一个纯用UNION ALL配合CASE聚合的方案,完美适配你的需求:
先理清楚数据对应关系
先修正下你原表的排版小失误,原表应该是这样的结构(假设表名叫RatingTable):
| Category | AAA | AA+ | AA | AA- |
|---|---|---|---|---|
| A | 6.05 | 7.15 | 9.5 | 8.5 |
| B | 3.02 | 4.58 | 6.25 | 7.25 |
| C | 2.25 | 1.02 | 0 | 6 |
你的目标是把列名(AAA、AA+等)转成No列的行值,同时把原表的行(A、B、C)转成列,对应每个评级的数值。
实现方案
核心思路分两步:
- 用UNION ALL把列转成行:把每个评级列(AAA/AA+/AA/AA-)拆成单独的行记录,带上对应的类别(A/B/C)和数值;
- 用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上可以正常运行;
执行这段代码后,就能得到你想要的输出格式啦:
| No | A | B | C |
|---|---|---|---|
| AAA | 6.05 | 3.02 | 2.25 |
| AA+ | 7.15 | 4.58 | 1.02 |
| AA | 9.5 | 6.25 | 0 |
| AA- | 8.5 | 7.25 | 6 |
内容的提问来源于stack exchange,提问作者Isai Selvan
相关产品推荐
相关产品推荐

