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

sql横向连接

发布时间: 2022-05-07 02:11:38

A. sql怎么样合并两个查询结果 横向显示出来

select a.d_roomid,a.d_type,b.d_roomid,b.d_personname from
ROOMPRICE a
left join REGISTER b on b.D_EXCHANGE='否' and b.D_STATE='未结帐'
and a.D_ROOMID=b.D_ROOMID

B. sql查询结果横向显示

简单啊,先用row_number 获取 No顺序,然后通过STUFF FOR XML PATH 获取顺序号转成字段

通过动态SQL利用PIVOT行列

C. sql中怎么让结果集横向显示

给你一个最长见的例子:普通行列转换
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
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 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

---------------------------------

/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

------------------
------------------

/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 748393
李四 748494
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/

select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb

D. MS SQL 如何将对同一个表的2个查询结果按条件横向连接起来

可以的,看起来语句比较复杂,如果觉得烦也可以用临时表:
SELECT * FROM
(SELECT A,B,C FORM TABLE1 WHERE A='TEST1' ) AS A,
(SELECT A,B,C FORM TABLE1 WHERE B='TEST2' ) AS B
WHERE A.C=B.C

E. sql 横向连接的问题

union --会合并结果集相同的项,只显示一次.会改为显示顺序
union all --不会合并不改变显示顺序

-----------问题1要根据表的结构而定
select
数量,
sum(应收价款) as 应收价款

from table group by ID--固定列的显示项

F. 如何把两个sql语句结果 横向合并起来

select table1 .field1, table2. field2 from table1
full join table2 on 1=1

G. 请问Sql server如何把一个内连接的输出的表格横向显示

普通sql很难做,要用sqlserver存储过程,用游标循环shorename的表,然后用case when一个一个拼起来

比如游标里写
create table aa as select osid,osuser,ostime,sum(case when shopname=@shopname and then osnumber else 0 end) as @shopname
from aa, shopname where aa.osid=shopname.osid

这样表aa在循环中每次都加上一个新shopname字段,直到游标shopname循环完毕,思路就是这样,最后再写个delete语句,把aa表里osnumber=0删掉就可以了,因为它都是表连接时由于shopname不匹配产生的垃圾数据

H. 怎样用sql把一个数据集纵向截成三段然后横向连接

这个数据集是我用别的方法做的

data means_2 (drop=Group);

merge means_1 (where=(group="A") rename=(age=GroupA))

means_1 (where=(group="B") rename=(age=GroupB))

means_1 (where=(group="C") rename=(age=Total)) ;

run ;
复制代码
自己编了一个sql的版本,第一个数据集是means—1

proc sql ;

create table work.means_2 as

select means_1.*

from work.means_1 (where=(group="A"))

full join work.means_1 (where=(group="B"))

on means_1._STAT_=means

I. orical SQL 怎么实现两个表横向连接在一起

SELECT DISTINCT * FROM (SELECT 表1.名称,表1.药品数量,表1.药品总额,表2.配药师人数,表2.配药量 FROM (表1 LEFT JOIN 表2 ON (表1.名称 = 表2.名称)) UNION ALL SELECT 表1.名称,表1.药品数量,表1.药品总额,表2.配药师人数,表2.配药量 FROM (表1 RIGHT JOIN 表2 ON (表1.名称 = 表2.名称)))
有好几种写法,这只是其中的一种

J. SQL横向+纵向合并

没有表结构,不清楚写的对不对,用了sum()over(),这是Oracle的用法,其他数据库能不能用就不清楚了,以下是代码

selectrownumas序号,a.*
from(selectdistincta.名称as医嘱名称,
zlspellcode(a.名称)as简码,
e.类别,
b.检查部位,
b.检查方法,
c.名称as收费名称,
c.标识主码,
b.收费数量as数量,
d.现价as价格,
c.站点,
dECOdE(A.撤档时间,
to_date('3000-01-01','YYYY-MM-dd'),
NULL,
null,
null,
'√')AS是否停用,
sum(b.收费数量*d.现价)over()as价格
from诊疗项目目录a,
诊疗收费关系b,
收费项目目录c,
收费价目d,
收费类别e
wherea.Id=b.诊疗项目Id
ANdb.收费项目Id=c.id
andc.Id=d.收费细目Id
anda.类别=e.编码
anda.撤档时间=to_date('3000-01-01','yyyy-mm-dd')
andd.终止日期=to_date('3000-01-01','yyyy-mm-dd')
anda.类别[0]
anda.服务对象=[1]
---orderbya.名称
)a
wherea.是否停用isnull
orderby序号