当前位置:首页 » 编程语言 » sql查询纵表成横表
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql查询纵表成横表

发布时间: 2022-06-08 14:47:50

sql中的统计加横表转纵表

根本没涉及横纵。
select a.*,b.军人人数,c.武警人数 from
(select 所在位置,count(*) as 警察人数 from 表 where 职务='警察' group by 位置) as a left jion
(select 所在位置,count(*) as 军人人数 from 表 where 职务='军人' group by 位置) as b
on a.所在位置=b.所在位置 left jion
(select 所在位置,count(*) as 武警人数 from 表 where 职务='武警' group by 位置) as c on a.所在位置=c.所在位置

❷ SQL 如何查询时 竖着的数据 横着显示

你这个是将纵表转换为横表,例如如下数据:
'wangming', 'shuxue', 100
'wangming', 'yuwen', 90
'wangming', 'yingyu', 140

可以使用如下语句处理:
select a.v_name,a.v_score shuxue,b.v_score yuwen,c.v_score yingyu from temp_1 a,temp_1 b,temp_1 c
where a.v_name=b.v_name
and a.v_name=c.v_name
and a.v_name='wangming'
and a.v_course='shuxue'
and b.v_course='yuwen'
and c.v_course='yingyu';

❸ sql竖表数据批量插入到横表中 注意是要插入到表中,不单单是查询出来

declare @idx int,@colName varchar(50),@tableID int,@sql varhcar(2000)

select @tableID=id from sysobjects where name='横表名'
set @idx=1
set @colName='Marks'+convert(varchar,@idx)
while(if exists(select * from sysocolumns where id=@tableID and name=@colName))
begin
set sql='insert into 纵表 select stuno,stuname,‘+@colName+’from 横表'
exec(@sql)
set @idx=@idx+1
set @colName='Marks'+convert(varchar,@idx)
end
没有调试,直观的基本上就是这个写法,复杂点的你可以单独再建个要需读取的列名表,循环取列名拼SQL再执行。
或者再写的复杂点,循环用union拼接select的部分
以上是针对类似问题的通用方案,适合列很多的情况。

如果仅限于上边的例 子不做任何扩展,最死的写法就是
insert into 纵表
from select * from(select stuno,stuname,marks1 from 横表
union select stuno,stuname,marks2 from 横表
union select stuno,stuname,marks3 from 横表
)t

当然如果直接查询生成表,也可以用select ...into的写法

❹ mysql纵表转横表

分两次进行不同的查询就可以实现了

  1. 先查出组员信息,比如组员数量、文章总数、评论总数等

  2. 再查出组长信息

  3. 两个查询一合并就可以了

SQL角本如下:

selecta.用户名组长,b.组员数量,b.文章总数,b.评论总数
from(select编号,用户名fromtable_namewhere角色='组长')a,--找组长信息
(select组长,
count(1)组员数量,
sum(文章)文章总数,
sum(评论)评论总数
fromtable_name
where组长isnotnull
groupby组长)b--找组员信息
wherea.编号=b.组长

❺ sql如何自动实现更新,竖表变横表,是要用触发器还是别的方法实现,具体代码如何写

先给你讲一下你说的横表变竖表,其实就是行列转换,我写个例子给你看看:

列转行

录入经营范围时候会遇到列传行的问题解决方案如下:

在temp1 表有一下字段内容:

❻ 求一个SQL查询语句,将纵向表横向表示

select id,max(case ele when 'c' then ecalue else null end) as c,
max(case ele when 'si' then ecalue else null end) as si,
max(case ele when 'mn' then ecalue else null end) as mn,
max(case ele when 's' then ecalue else null end) as s,
……from 表 group by id
--有多少列就加max(case ele when 列名 then ecalue else null end) as 列名

❼ 如何通过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 里面怎么把竖表变成横表

select 姓名,sum(case when 科目='数学' then 分数 end) as 数学,sum(case when 科目='语文' then 分数 end) as 语文,sum(case when 科目='英语' then 分数 end) as 英语 from 表名
group by 姓名

❾ sql server 纵表转横表

如果单纯是你如上数据的话这样:

创建表:

createtablet
(idint,
orderidint,
prfnoint,
prfidvarchar(10));


insertintotvalues(16385,171202,1,'FB065_1');
insertintotvalues(16385,171202,2,'FB065_06');
insertintotvalues(16385,171202,3,'FB065_06');
insertintotvalues(16385,171202,4,'FB065_06');

insertintotvalues(16386,171202,1,'FB065_1');
insertintotvalues(16386,171202,2,'FB065_06');
insertintotvalues(16386,171202,3,'FB065_06');
insertintotvalues(16386,171202,4,'FB065_06');

执行:

selectid,orderid,
max(casewhenprfno=1thenprfidend)prfid1,
max(casewhenprfno=2thenprfidend)prfid2,
max(casewhenprfno=3thenprfidend)prfid3,
max(casewhenprfno=4thenprfidend)prfid4
fromtgroupbyid,orderid

结果:

如果需求复杂的话,就要改别的方法了。