SQL server2008列转行
时间: 2023-09-12 16:03:28 浏览: 92
sql 列转行
在 SQL Server 2008 中,可以使用 PIVOT 和 UNPIVOT 这两个关键字来实现列转行和行转列。
列转行:
假设你有一个 Employee 表,其中包含了员工的姓名、工资和工作部门:
|姓名|工资|部门|
|---|---|---|
|张三|5000|销售|
|李四|6000|人力|
|王五|7000|技术|
现在你想将部门作为列,将工资作为值,将每个员工的工资转换为部门工资汇总,可以使用 PIVOT 实现:
```sql
SELECT *
FROM (
SELECT name, salary, department
FROM Employee
) AS SourceTable
PIVOT (
SUM(salary)
FOR department IN ([销售], [人力], [技术])
) AS PivotTable;
```
执行这个 SQL 查询语句,会得到以下结果:
|姓名|销售|人力|技术|
|---|---|---|---|
|张三|5000|null|null|
|李四|null|6000|null|
|王五|null|null|7000|
可以看到,每个部门的工资汇总都被转换成了列,每个员工的工资则被放置在相应的列下面。
行转列:
假设你有一个 Orders 表,其中包含了订单号、客户姓名、订单日期和订单金额:
|订单号|客户姓名|订单日期|订单金额|
|---|---|---|---|
|1|张三|2021-01-01|200|
|2|张三|2021-01-02|300|
|3|李四|2021-01-03|400|
|4|李四|2021-01-04|500|
现在你想将客户姓名作为列,将订单日期作为行,将订单金额作为值,可以使用 UNPIVOT 实现:
```sql
SELECT *
FROM (
SELECT order_no, customer_name, order_date, order_amount
FROM Orders
) AS SourceTable
UNPIVOT (
order_amount FOR order_date IN ([2021-01-01], [2021-01-02], [2021-01-03], [2021-01-04])
) AS UnpivotTable;
```
执行这个 SQL 查询语句,会得到以下结果:
|订单号|客户姓名|order_date|order_amount|
|---|---|---|---|
|1|张三|2021-01-01|200|
|2|张三|2021-01-02|300|
|3|李四|2021-01-03|400|
|4|李四|2021-01-04|500|
可以看到,客户姓名被转换为列,订单日期被转换为行,订单金额被放置在相应的行列位置上。
阅读全文