sql - 如何创建数据成为列

标签 sql sql-server tsql

我们如何针对这种情况编写SQL查询?
该表的结构为;

|房间黑色|数据|
| 1 | A | 12 |
| 2 | A | 13 |
| 1 | B | 14 |
| 3 | B | 15 |


预期产量:


|房间A | B |
| 1 | 12 | 14 |
| 2 | 13 |空|
| 3 | null | 15 |

最佳答案

您可以尝试使用条件聚合

DEMO

select room, max(case when BLOK='A' then DATA end) as A,
max(case when BLOK='B' then DATA end) as B
from tablename
group by room


或尝试使用PIVOT

select room,pv.* from 
tablename
pivot(max(DATA) for BLOK in ([A],[B])) pv


输出:

Room    A   B
1      12   14
2      13   
3           15


对于动态数据透视

declare @sql varchar(max)='',@col_list varchar(8000)=''

set @col_list = (select distinct quotename([BLOK])+',' from tablename
for xml path(''))

set @col_list = left (@col_list,len(@col_list)-1)

set @sql = 'select Room,'+@col_list+' from
tablename
pivot (max([DATA]) for [BLOK] in ('+@col_list+'))pv'

exec(@sql)


FIDDLE FOR DYNAMIC PIVOT

关于sql - 如何创建数据成为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53273744/

相关文章:

sql - SQL Server 上的 YEARFRAC 函数不起作用

sql-server - 解决 SqlBulkCopy 没有执行最少日志记录的问题

sql - 使用时间跨度对具有相同值的连续行进行分组

sql - 如何在sql语句中将日期递增1作为时间数

sql - 数据库统计有多大用处

SQL Left 将两个表合并为一个

Java 和prepareStatement 与MySQL

mysql - SQL 查询将多个值添加到属性中

php - SQL 查询对于另一个 mysql 版本执行速度较慢?

sql - 如何通过排序、分区和分组进行行编号