SQL如何将两个列数不一样的表的内容纵向拼接在一起

SQL如何将两个列数不一样的表的内容纵向拼接在一起,第1张

工具/材料:Management Studio。

1、首先在桌面上,点击“Management Studio”图标。

2、之后在该界面中,点击左上角“新建查询”选项。

3、接着在该界面中,输入纵向拼接两个列数不一样的表的内容的sql语句“select * from myDevice left join myDepart on myDevice.DepartNo = myDepart.DepartNo”。

4、然后在该界面中,点击左上方“执行”按钮。

5、最后在该界面中,显示纵向拼接两个列数不一样的表的内容成功。

您好,行列转换等经典SQL语句

参考资料:http://blog.csdn.net/kiki113/archive/2009/04/24/4105929.aspx

1.--行列转换

原表: 姓名 科目 成绩

张三 语文80

张三 数学90

张三 物理85

李四 语文85

李四 物理82

李四 英语90

李四 政治70

王五 英语90

转换后的表: 姓名 数学物理 英语语文政治

李四 0 8290 85 70

王五 0 0 90 0 0

张三9085 0 800

实例:

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')

第一个语句:

SELECT A.到达时间, A.票号, B.品名, B.件数, B.重量, C.费用名称, C.金额

FROM A,B,C

WHERE A.票号=B.票号 AND A..票号=C..票号

查询结果:

到达时间 票号 品名 件数 重量 费用名称 金额

20080319 999 食品 2 30 转运费 15.00

20080319 999 食品 2 30 送货费 50.00

20080316 888 配件 1 15 转运费 5.00

20080316 888 配件 1 15 运费 40.00

第二个语句:

SELECT A.到达时间, A.票号, B.品名, B.件数, B.重量,

SUM(CASE C.费用名称 WHEN "运费" THEN C.金额 ELSE 0 END CASE) 运费,

SUM(CASE C.费用名称 WHEN "转运费" THEN C.金额 ELSE 0 END CASE) 转运费,

SUM(CASE C.费用名称 WHEN "送货费" THEN C.金额 ELSE 0 END CASE) 送货费

FROM A,B,C

WHERE A.票号=B.票号 AND A..票号=C..票号

GROUP BY A.到达时间, A.票号, B.品名, B.件数, B.重量

查询结果:

到达时间 票号 品名 件数 重量 运费 转运费 送货费

20080319 999 食品 2 30 0.00 15.00 50.00

20080319 888 配件 1 15 40.00 5.00 0.00


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11649032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存