sql纵向变横向
❶ 急急急!!! sql语句如何将竖排的记录变横排并且放置在同一单元格内,跪求大神指点,万分感谢!!!
selectname姓名,col1+''+col2+''+col3参保类型
from(
selectname,'失业保险'ascol1,'医疗保险'ascol2,'工伤保险'ascol3fromtable1
pivot(max(type)fortypein([失业保险],[医疗保险],[工伤保险]))
aspvt)tab
lz试一下,有问题再追问。
❷ sql怎么让查询的结果纵向变横向
sql server有行列转换的语句
❸ oracle 数据库sql高手来看看,如何纵向转横向
假设表有A,B两列,代码如下
selectA,LISTAGG(B,',')WITHINGROUP(ORDERBYB)BfromtablegroupbyA
上面SQL文可将B列横向输出,以逗号分割,输出顺序按B的值升序排列
❹ sql语句 把纵向的数据变成横向
declare @A table(字段1 varchar(1), 字段2 int)
insert into @A
select 'A',1 union all
select 'A',2 union all
select 'A',3 union all
select 'A',4 union all
select 'A',5 union all
select 'B',1 union all
select 'B',2 union all
select 'B',3 union all
select 'B',4 union all
select 'B',5
SELECT * from @a
select 字段1,
max(case 字段2 when 1 then 字段2 end) 字段2,
max(case 字段2 when 2 then 字段2 end) 字段3,
max(case 字段2 when 3 then 字段2 end) 字段4,
max(case 字段2 when 4 then 字段2 end) 字段5,
max(case 字段2 when 5 then 字段2 end) 字段6
from @A
group by 字段1
---结果如下--------------------------------
(10 个资料列受到影响)
字段1 字段2
---- -----------
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
(10 个资料列受到影响)
字段1 字段2 字段3 字段4 字段5 字段6
---- ----------- ----------- ----------- ----------- -----------
A 1 2 3 4 5
B 1 2 3 4 5
(2 个资料列受到影响)
❺ sql纵向数据变为横向数据遇到问题,请帮助,谢谢
selectName,STUFF((select','+Subjectfrom表whereName=A.Nameforxmlpath('')),1,1,'')from(selectdistinctNamefrom表)A
❻ Mysql中查询(数据库中的)纵向转(查询结果显示为)横向.
1、在mysql环境,创建数据库表,
create table test_data1(id int, name VARCHAR(20), day VARCHAR(20))
❼ 如何通过sql将表中竖向数据转换成横向数据
行列转换等经典SQL语句
参考资料:http://blog.csdn.net/kiki113/archive/2009/04/24/4105929.aspx
1.--行列转换
原表: 姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 物理 82
李四 英语 90
李四 政治 70
王五 英语 90
转换后的表: 姓名 数学 物理 英语 语文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
张三 90 85 0 80 0
实例:
create table cj --创建表cj
(
ID Int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定义ID为表cj的主键
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '张三','语文',80 union all
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90
--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列转换--合并
原表: 班级 学号
1 1
1 2
1 3
2 1
2 2
3 1
转换后的表: 班级 学号
1 1,2,3
2 1,2
3 1
实例:
Create table ClassNo --创建表ClassNo
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Class Varchar(50), --班级列
Number Varchar(50), --学号列
Primary Key(ID) --定义ID为表ClassNo的主键
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
创建一个合并的函数
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
--调用自定义函数得到结果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列转行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定义ID为表ColumnToRow的主键
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的长度就是这个字符串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因为它会把ID这一列的值也算进去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')
❽ SQL SERVER中纵向的数据横向显示出来
create TABLE Table1 (Name varchar(50),Subject varchar(50))
INSERT INTO TABLE1 VALUES('A','a1')
INSERT INTO TABLE1 VALUES('A','a2')
INSERT INTO TABLE1 VALUES('A','a3')
INSERT INTO TABLE1 VALUES('A','a4')
INSERT INTO TABLE1 VALUES('A','a5')
INSERT INTO TABLE1 VALUES('A','a6')
INSERT INTO TABLE1 VALUES('A','a7')
INSERT INTO TABLE1 VALUES('B','b1')
INSERT INTO TABLE1 VALUES('B','b2')
INSERT INTO TABLE1 VALUES('B','b3')
INSERT INTO TABLE1 VALUES('B','b4')
INSERT INTO TABLE1 VALUES('B','b5')
INSERT INTO TABLE1 VALUES('B','b11')
INSERT INTO TABLE1 VALUES('B','b23')
INSERT INTO TABLE1 VALUES('B','b34')
INSERT INTO TABLE1 VALUES('B','b8')
INSERT INTO TABLE1 VALUES('B','b9')
INSERT INTO TABLE1 VALUES('B','b15')
就生成了表单TABLE1,如果把公司名称A,B横向输出,Subject的话,比较简单的是把Subject显示在1列,里面元素用","隔开,如果分列显示,就要找到Subject最长的列,否则影响效率;
因为不知道你的参数最多是多少,所以就在1列中显示.
可以写一个函数F_str
create function F_str(@name varchar)
returns nvarchar(100)
as
begin
declare @S nvarchar(100)
select @S=isnull(@S+',','')+Subject from table1 where Name=@name
return @S
end
生成函数后在调用即可:
select distinct Name,Subject=dbo.F_str(Name) from Table1
自己用的话注意每次实验删除函数,不然创建2次重名的函数是不可以的
因为我的Name是动态读取的,不管多少公司,都是没问题的,唯一的不同就是
产品显示出来是在一列当中,而不是分列显示,不知道满足你的需求吗.
Name Subject
A a1,a2,a3.....
B b1,b2,b3.....
C c1,c2,c3.....
... .....
这种格式的,Subject是不分列的,在一列.
要是需要分列的话,实现比较麻烦,需要的话,和我说.
declare @c int,@sql varchar(5000)
set @c=(select max(a) from (select count(*)a from table1 group by name)b)
declare @i int
set @i=1
select x=@c,y='列'+cast(@c as varchar) into #temp
while @i<@c
begin
insert into #temp values(@i,'列'+cast(@i as varchar))
set @i=@i+1
end
select y,name,subject into #temp2 from #temp t left join (select ROW_NUMBER() over(PARTITION BY name order by name) as id,name,subject from table1 ) tb on tb.id=t.x
set @sql = 'select name'
select @sql = @sql + ' , max(case y when ''' + y + ''' then subject else null end )[' + y + ']'
from (select distinct y from #temp2 ) as a
set @sql = @sql + ' from #temp2 group by name'
exec(@sql)
drop table #temp
drop table #temp2
SQL2005可以用,2000估计不能用,2000函数不全
❾ sql 里面怎么把竖表变成横表
SELECT 姓名
,'数学'=MAX(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END)
,'语文'=MAX(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END)
,'英语'=MAX(CASE 课程 WHEN '英语' THEN 分数 ELSE 0 END)
FROM TB
GROUP BY 姓名
--或者
SELECT 姓名,
,'数学'=SUM(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END)
,'语文'=SUM(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END)
,'英语'=SUM(CASE 课程 WHEN '英语' THEN 分数 ELSE 0 END)
FROM TB
GROUP BY 姓名