SQL把查询出的一个列转换成行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL把查询出的一个列转换成行相关的知识,希望对你有一定的参考价值。

参考技术A if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85
Go

declare @s nvarchar(4000)
select @s=isnull(@s+',','')+quotename(Name)
from syscolumns where ID=object_id('Class') and Name not in('Student')
order by Colid
exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')

go
select
Student,[Course],[Score]
from
Class
unpivot
([Score] for [Course] in([数学],[物理],[英语],[语文]))b
参考技术B 2005版本以下用循环可以实现
2005版本以上可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表本回答被提问者采纳

sql 行变成列

如何把 select 1,2,3,4。。。。 筛选的结果变成
列头A
1
2
3
4
即查询的一行结果变成一列

参考技术A declare @s nvarchar(4000)
select @s=isnull(@s+',','')+quotename(Name)
from syscolumns where ID=object_id('aa') 
order by Colid
exec('select id,name from aa unpivot (name for id in('+@s+'))b')

如图:

参考技术B 楼主 声明一个变量 把列传给变量即可 行转列 有专门的函数的
下面是课程表 有列课程和分数
你参考这个例子 就可以了
declare @sql varchar(8000)=‘’
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')本回答被提问者和网友采纳
参考技术C SELECT mgr,
deptno,
MAX(decode(empno, '7788', ename, NULL)) "7788",
MAX(decode(empno, '7902', ename, NULL)) "7902",
MAX(decode(empno, '7844', ename, NULL)) "7844",
MAX(decode(empno, '7521', ename, NULL)) "7521",
MAX(decode(empno, '7900', ename, NULL)) "7900",
MAX(decode(empno, '7499', ename, NULL)) "7499",
MAX(decode(empno, '7654', ename, NULL)) "7654"
FROM emp
WHERE mgr IN (7566, 7698)
AND deptno IN (20, 30)
GROUP BY mgr, deptno
ORDER BY 1, 2;
你可以参考一下!追问

我只有一行数据,没有是想group by 的基础

追答

没看懂!

追问

请教个问题,表A的列有数据1,2,3,4 我传入一组变量数据(1,2,3,4,5),如何查询出5 不在表A中呢?

追答

判断table1中是否存在name字段
if exists(select * from syscolumns where id=object_id('table1') and name='name') begin
select * from people;
end

参考技术D select 1 from ..
union all
select 2 from ..
union all
select 3 from ..
...
...
;追问

谢谢你的回答

但是我有无数列的,这个方法不可取

追答

你这是列转行,
行转列用case when实现, 列转行就是用union all
难道你横着写就不用列举出来吗

追问

请教个问题,表A的列有数据1,2,3,4 我传入一组变量数据(1,2,3,4,5),如何查询出5 不在表A中呢?

第5个回答  2013-09-17 什么的sqlserver?

以上是关于SQL把查询出的一个列转换成行的主要内容,如果未能解决你的问题,请参考以下文章

如何把sqlserver中的列转换成行,行转换成列,显示

SQL将一列转换成一行,并将这一行形成新的列

c#如何把Json转成DataTable每一行都一一对应下面多出来的列自动添加到后方

oracle 行列转换

怎样把sql数据库转换成Mysql的?

sql 行变成列