工具/材料: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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)