SQL大圣之路笔记——SQL 行转列,列转行

  1 

  /*普通行列转换
  2 (爱新觉罗.毓华 2007-11-18于海南三亚)
  3
  4 假设有张学生成绩表(tb)如下:
  5 Name Subject Result
  6 张三 语文  74
  7 张三 数学  83
  8 张三 物理  93
  9 李四 语文  74
 10 李四 数学  84
 11 李四 物理  94
 12 */
 13
 14 -------------------------------------------------------------------------
 15 /*
 16 想变成
 17 姓名         语文        数学        物理
 18 ---------- ----------- ----------- -----------
 19 李四         74          84          94
 20 张三         74          83          93
 21 */
 22
 23 create table tb
 24 (
 25    Name    varchar(10) ,
 26    Subject varchar(10) ,
 27    Result  int
 28 )
 29
 30 insert into tb(Name , Subject , Result) values(‘张三‘ , ‘语文‘ , 74)
 31 insert into tb(Name , Subject , Result) values(‘张三‘ , ‘数学‘ , 83)
 32 insert into tb(Name , Subject , Result) values(‘张三‘ , ‘物理‘ , 93)
 33 insert into tb(Name , Subject , Result) values(‘李四‘ , ‘语文‘ , 74)
 34 insert into tb(Name , Subject , Result) values(‘李四‘ , ‘数学‘ , 84)
 35 insert into tb(Name , Subject , Result) values(‘李四‘ , ‘物理‘ , 94)
 36 go
 37
 38 --静态SQL,指subject只有语文、数学、物理这三门课程。
 39 select name 姓名,
 40   max(case subject when ‘语文‘ then result else 0 end) 语文,
 41   max(case subject when ‘数学‘ then result else 0 end) 数学,
 42   max(case subject when ‘物理‘ then result else 0 end) 物理
 43 from tb
 44 group by name
 45 /*
 46 姓名         语文        数学        物理
 47 ---------- ----------- ----------- -----------
 48 李四         74          84          94
 49 张三         74          83          93
 50 */
 51
 52 --动态SQL,指subject不止语文、数学、物理这三门课程。
 53 declare @sql varchar(8000)
 54 set @sql = ‘select Name as ‘ + ‘姓名‘
 55 select @sql = @sql + ‘ , max(case Subject when ‘‘‘ + Subject + ‘‘‘ then Result else 0 end) [‘ + Subject + ‘]‘
 56 from (select distinct Subject from tb) as a
 57 set @sql = @sql + ‘ from tb group by name‘
 58 exec(@sql)
 59 /*
 60 姓名         数学        物理        语文
 61 ---------- ----------- ----------- -----------
 62 李四         84          94          74
 63 张三         83          93          74
 64 */
 65
 66 -------------------------------------------------------------------
 67 /*加个平均分,总分
 68 姓名         语文        数学        物理        平均分                总分
 69 ---------- ----------- ----------- ----------- -------------------- -----------
 70 李四         74          84          94          84.00                252
 71 张三         74          83          93          83.33                250
 72 */
 73
 74 --静态SQL,指subject只有语文、数学、物理这三门课程。
 75 select name 姓名,
 76   max(case subject when ‘语文‘ then result else 0 end) 语文,
 77   max(case subject when ‘数学‘ then result else 0 end) 数学,
 78   max(case subject when ‘物理‘ then result else 0 end) 物理,
 79   cast(avg(result*1.0) as decimal(18,2)) 平均分,
 80   sum(result) 总分
 81 from tb
 82 group by name
 83 /*
 84 姓名         语文        数学        物理        平均分                总分
 85 ---------- ----------- ----------- ----------- -------------------- -----------
 86 李四         74          84          94          84.00                252
 87 张三         74          83          93          83.33                250
 88 */
 89
 90 --动态SQL,指subject不止语文、数学、物理这三门课程。
 91 declare @sql1 varchar(8000)
 92 set @sql1 = ‘select Name as ‘ + ‘姓名‘
 93 select @sql1 = @sql1 + ‘ , max(case Subject when ‘‘‘ + Subject + ‘‘‘ then Result else 0 end) [‘ + Subject + ‘]‘
 94 from (select distinct Subject from tb) as a
 95 set @sql1 = @sql1 + ‘ , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name‘
 96 exec(@sql1)
 97 /*
 98 姓名         数学        物理        语文        平均分                总分
 99 ---------- ----------- ----------- ----------- -------------------- -----------
100 李四         84          94          74          84.00                252
101 张三         83          93          74          83.33                250
102 */
103
104 drop table tb
105
106 ---------------------------------------------------------
107 ---------------------------------------------------------
108 /*
109 如果上述两表互相换一下:即
110
111 姓名 语文 数学 物理
112 张三 74  83  93
113 李四 74  84  94
114
115 想变成
116 Name       Subject Result
117 ---------- ------- -----------
118 李四         语文      74
119 李四         数学      84
120 李四         物理      94
121 张三         语文      74
122 张三         数学      83
123 张三         物理      93
124 */
125
126 create table tb1
127 (
128    姓名 varchar(10) ,
129    语文 int ,
130    数学 int ,
131    物理 int
132 )
133
134 insert into tb1(姓名 , 语文 , 数学 , 物理) values(‘张三‘,74,83,93)
135 insert into tb1(姓名 , 语文 , 数学 , 物理) values(‘李四‘,74,84,94)
136
137 select * from
138 (
139   select 姓名 as Name , Subject = ‘语文‘ , Result = 语文 from tb1
140   union all
141   select 姓名 as Name , Subject = ‘数学‘ , Result = 数学 from tb1
142   union all
143   select 姓名 as Name , Subject = ‘物理‘ , Result = 物理 from tb1
144 ) t
145 order by name , case Subject when ‘语文‘ then 1 when ‘数学‘ then 2 when ‘物理‘ then 3 when ‘总分‘ then 4 end
146
147 --------------------------------------------------------------------
148 /*加个平均分,总分
149 Name       Subject     Result
150 ---------- -------    --------------------
151 李四         语文      74.00
152 李四         数学      84.00
153 李四         物理      94.00
154 李四         平均分    84.00
155 李四         总分      252.00
156 张三         语文      74.00
157 张三         数学      83.00
158 张三         物理      93.00
159 张三         平均分    83.33
160 张三         总分      250.00
161 */
162
163 select * from
164 (
165   select 姓名 as Name , Subject = ‘语文‘ , Result = 语文 from tb1
166   union all
167   select 姓名 as Name , Subject = ‘数学‘ , Result = 数学 from tb1
168   union all
169   select 姓名 as Name , Subject = ‘物理‘ , Result = 物理 from tb1
170   union all
171   select 姓名 as Name , Subject = ‘平均分‘ , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
172   union all
173   select 姓名 as Name , Subject = ‘总分‘ , Result = 语文 + 数学 + 物理 from tb1
174 ) t
175 order by name , case Subject when ‘语文‘ then 1 when ‘数学‘ then 2 when ‘物理‘ then 3 when ‘平均分‘ then 4 when ‘总分‘ then 5 end
176
177 drop table tb1
时间: 2024-11-05 06:12:43

SQL大圣之路笔记——SQL 行转列,列转行的相关文章

SQL大圣之路笔记——SQL学习笔记

1.复习->自连接 针对于什么结构的表做自连接 关系列引用本表的主键列信息 这种表不是单一的含义->外连接 left join right join full join->case子句 必须出现在select语句中 完成选择功能->常用全局变量:@@identity,@@error->over子句:结合编号.聚合使用 sum(ocount) over() 开窗函数:将多行数据进行划区 over(partition by 列名 order by 列名) rank() row_n

SQL大圣之路笔记——SQL 创建索引 index

1 --创建索引的标准:根据实际的sql语句进行分析,’列’出现在where中的次数较多,时间损耗较大,则为这个‘列’建立索引, 2 3 --注意:不是越多越好,因为没建立一个‘列’索引,都要排序存储一次,会让数据库文件变大 4 5 6 --创建索引 7 create index index_name 8 on 表名(列名)

SQL大圣之路笔记——SQL存储过程优化之 nocount

在存储过程中,经常用到SET NOCOUNT ON: 作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息.当SET ONCOUNT ON时候,不返回计数,当SET NOCOUNT OFF时候,返回计数: 即使当SET NOCOUNT ON 时候,也更新@@RowCount: 当SET NOCOUNT on时候,将不向客户端发送存储过程每个语句的DONE_IN_proc消息,如果存储过程中包含一些并不返回实际数据的语句,网络通信流量便会大量减少,可以显著提高应用程序性能: SE

SQL大圣之路笔记——SQL TRUNCATE,DELETE,DROP

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项.TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放. TRUNCATE,DELETE,DROP放在一起比较:TRUNCATE TABLE:删除内容.释放空间但不删除定义.D

SQL大圣之路笔记——SQL 获取excel中的数据

1 select 2 --case (isnumeric(CMF_No)) when 1 then Convert(decimal(18,0),CMF_No) 3 --else Convert(nvarchar(255),CMF_No) end as CMF_No,Disti_Name, 4 --case (isnumeric(Disti_Invoice_Num)) when 1 then Convert(decimal(18,0),Disti_Invoice_Num) else 'sss' e

SQL大圣之路笔记——把数据库中表里的数据导出成Excel(Copy时,会因分隔符问题导致许多数据存放在一个单元格中)

1.选中DB, 右击选择"Tasks",选中"Export Data" 点击. 2.点击"Next", Authentication 选择使用 "Windows 用户名认证" or "SQL Server 用户名,密码认证",点击"Next".    3.保存文件格式:"Excel", 选择保存文件的路径.Excel 版本,点击"Next".-&g

SQL大圣之路笔记——把Excel中的数据通过Access导入到DataBase中

把Excel中的数据通过Access导入到DataBase中 1.打开Access ,点击“EXTERNAL DATA",选择上传”excel",选中需要导入的excel,点击ok. 2.选择excel中需要上传数据的sheet,点击”next",再点击“next”,选择列明,更改 Data Type (Short Text类型导入后会成为nvarchar);点击“next”,再点击“next” ,设定导入DB之后的表名,点击“finish”. 3.右击表名,点击“Expor

c#大圣之路笔记——SQL 通过创建存储过程,查看当前进程情况(是否造成表锁死等)

存储过程: 1 create procedure sp_who_lock 2 3 as 4 5 begin 6 7 declare @spid int,@bl int, 8 9 @intTransactionCountOnEntry int, 10 11 @intRowcount int, 12 13 @intCountProperties int, 14 15 @intCounter int 16 17 18 19 create table #tmp_lock_who ( 20 21 id i

SQL大圣之路笔记——存储过程中含有大量sql时,使用事务处理机制

1 --事务开始,如果中间有系统错误,则Roll Back 2 BEGIN TRY 3 BEGIN TRAN 4 --存储过程的全部脚本 5 SELECT * 6 FROM #raw_data 7 WHERE id = @rowNo 8 9 COMMIT TRAN 10 END TRY 11 BEGIN CATCH 12 ROLLBACK TRAN 13 --系统错误 14 INSERT INTO store_batch_import_templog 15 ( Remark 16 ) 17 SE