sql server 纵表转横表

演示如下:

1.建表:

create table tb
(
   Name    varchar(10) ,
   Subject varchar(10) ,
   Result  int
)

2.插入数据:
insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)

3.纵表转横表,静态方式:
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理
from tb
group by name
3.纵表转横表,动态方式:
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else null end) [' + Subject + ']'
from (select distinct Subject from tb) as a
print(@sql)
set @sql = @sql + ' from tb group by name'
exec(@sql)
--print(@sql)

### 将 SQL 查询结果中的列换为行 在 SQL 中,可以使用 `UNPIVOT` 关键字来实现将多列数据置为纵向显示的功能。此操作通常用于将宽结构化为长结构。 以下是关于如何使用 `UNPIVOT` 的具体说明以及示例: #### UNPIVOT 基本语法 ```sql SELECT 新列名, 换后的值 FROM 名 UNPIVOT ( 换后的值 FOR 新列名 IN (原列1, 原列2, ..., 原列N) ) AS 别名; ``` 其中: - **新列名** 是指定用来存储原始列名称的新字段。 - **换后的值** 是指代所有被旋的数值所在的新字段。 - **IN 子句** 定义哪些列参与旋过程。 #### 示例场景 假设有一张名为 `Sales` 的格,其结构如下所示[^1]: | Year | Jan_Sales | Feb_Sales | Mar_Sales | |------|-----------|-----------|-----------| | 2020 | 100 | 150 | 200 | | 2021 | 120 | 180 | 220 | 目标是将每个月份的销售数据从横向排列变为垂直方向展示。 执行以下语句可完成需求: ```sql SELECT Year, Month, Sales_Amount FROM Sales UNPIVOT ( Sales_Amount FOR Month IN ([Jan_Sales], [Feb_Sales], [Mar_Sales]) ) AS Unpivoted_Data; ``` 运行之后的结果将是这样的形式[^1]: | Year | Month | Sales_Amount | |------|-----------|--------------| | 2020 | Jan_Sales | 100 | | 2020 | Feb_Sales | 150 | | 2020 | Mar_Sales | 200 | | 2021 | Jan_Sales | 120 | | 2021 | Feb_Sales | 180 | | 2021 | Mar_Sales | 220 | 以上方法适用于大多数支持标准 SQL数据库管理系统(DBMS),比如 Microsoft SQL Server 和 Oracle Database 等[^2]。 对于不完全兼容 `UNPIVOT` 功能或者有特殊业务逻辑的情况,则可能需要借助其他技术手段如交叉联接(CROSS JOIN)、条件聚合函数等替代方案达成相似效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值