关于 sql 行转列的感悟51CTO博客 - 牛牛娱乐

关于 sql 行转列的感悟51CTO博客

2019年04月23日09时34分20秒 | 作者: 运鹏 | 标签: 成果,科目,名字 | 浏览: 2278

 自从看《学技能的不能自废武功》这篇文章后,我深有感触,所以对自己曾经学过的常识又从头温习了一次,成果总算发现了一些新的感悟,现将其感悟宣布,于咱们共勉: 关于 sql 行转列的感悟 (表1) 要将其转变为:     (表2) 能够看得出来,表2列是由表1的行数据转化而来的,只需名字列是表1中的列。 一步一步的来嘛,其他的列难搞,假如表2只需1列名字的话,那么very easy了,不便是一个简略的分组嘛。 Select 名字 From 表1 Group By 名字   现在sql句子的架子搭起来了,不管今后怎样改变,分组是少不了的。 那么开端下一步,想这个成果会集再增加1列,多了咱们不加,由于你不论是能处理语文,仍是数学,仍是英语列,那么其他的列只需原样照抄就能够了,顶多修正一下参数罢了。 从语文列开端吧,这一列的数据都能够从表1中找到,假如咱们只需“语文”这一列,那么也好写。 Sql句子疑似: Select 名字,case  when 科目=语文 then 成果 end From 成果表 Group By 名字 那就F5吧。 嗯,啊,...挂了。 赶忙看过错提示: 服务器: 音讯 8120,等级 16,状况 1,行 1
列 成果表.成果 在挑选列表中无效,由于该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

服务器: 音讯 8120,等级 16,状况 1,行 1
列 成果表.科目 在挑选列表中无效,由于该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
从过错信息中,可知字段成果和科目还必须在聚合函数中或Group By中,怎样在Group By中呢?   数据却是有了,但是行多了点,看来只能从聚合下手了。 到底是那个聚合?聚合有max,min,avg,sum,count,max和min首要干掉,咱们不是要最大值,最小值,莫非是平均值?莫非是个数?莫非是求和??? 那就试试呗。 Select 名字,sum(case when 科目=语文 then 成果 end) From 表1 Group By 名字     嘿,真不错。   该有的都有了,便是没列名,好办,给个别号嘛。 Select 名字,sum(case when 科目=语文 then 成果 end) As 语文 From表1 Group By 名字   那么其他几列也就好办了。  Select 名字,
 sum(case when 科目=语文 then 成果 end) As 语文
,
 sum(case when 科目=数学 then 成果 end) As 数学
,
 sum(case when 科目=英语 then 成果 end) As 英语

 From  表1 Group By 名字
     但是成果有NULL,那还不好办,你的case when then end没写完,还有else没写呢!
Select 名字,
 sum(case when 科目=语文 then 成果 else 0 end) As 语文
,
 sum(case when 科目=数学 then 成果 else 0 end) As 数学
,
 sum(case when 科目=英语 then 成果 else 0 end) As 英语

 From 表1 Group By 名字
      总算修成正果了。   真的? 当然是假的? 怎样假? 这不废话么!你现在写的Sql句子只能支撑科目表中只需语文数学英语,那假如课程中加了一个叫物理的,那你不得改程序了吗?! 怎样办?凉拌。 也便是说这个Sql句子中有改变的当地在红字部分: Select 名字,
 sum(case when 科目=语文 then 成果 else 0 end) As 语文
,
 sum(case when 科目=数学 then 成果 else 0 end) As 数学
,
 sum(case when 科目=英语 then 成果 else 0 end) As 英语

 From  表1 Group By 名字
红字部分要从哪里来?假如专注看,那么应该能从中心看出来,哪些个“As 语文”,哪些个“科目=语文”,其实是数据表中的值,假如只是要查询“语文,数学,英语”的话,那么easy啊。 Select 课程 From 表1 Group By 科目 但是咱们要的成果是: sum(case when 科目=语文 then 成果 else 0 end) As 语文 ,
 sum(case when 科目=数学 then 成果 else 0 end) As 数学
,
 sum(case when 科目=英语 then 成果 else 0 end) As 英语

……………..

那不简略,便是些字符串嘛。 Select ,sum(case when 科目=+trim(科目)+ then 成果 else 0 end) As +科目+ From 表1 Group By 课程 成果为:  ,sum(case when 科目=语文 then 成果 else 0 end) As 语文 ,
 ,sum(case when 科目=数学 then 成果 else 0 end) As 数学,
 ,sum(case when 科目=英语 then 成果 else 0 end) As 英语
      哈哈,只需将这一段和方才的Select 名字拼在一起就能够了。 现在费事来了,拼没有问题。 declare @sql nvarchar(4000) set @sql=Select 名字 Select @sql=@sql+,sum(case when 科目=+科目+ then 成果 else 0 end) As +科目+         From表1 Group By 科目 Print @sql 这一段的成果是: Select 名字 ,sum(case when 科目=数学 then 成果 else 0 end) As 数学,sum(case when 科目=英语 then 成果 else 0 end) As 英语,sum(case when 科目=语文 then 成果 else 0 end) As 语文 跟咱们的要求比较接近了,还要附加一点东西: Select 名字 ,sum(case when 科目=数学 then 成果 else 0 end) As 数学,sum(case when 科目=英语 then 成果 else 0 end) As 英语,sum(case when 科目=语文 then 成果 else 0 end) As 语文 From 表1 Group By 名字 现在费事的是,怎样履行这个字符串,现在咱们将sql句子放在了 @sql 这个变量中了,怎样履行? 灵机1动! SqlServer中有个专门将字符串作为sql句子履行的存储进程 sp_executesql。 便是它了。 终究版别: declare @sql nvarchar(4000) set @sql=Select 名字 Select @sql=@sql+,sum(case when 科目=+科目+ then 成果 else 0 end) As +科目+         From 成果表 Group By 科目 Print @sql set @sql=@sql+ From 成果表 Group By 名字 Print @sql execute sp_executesql @sql 当然科目信息,纷歧定会从成果表中获取,很有可能是一个专门的表格,比方叫“科目表”,那么就更easy了。 declare @sql nvarchar(4000) set @sql=Select 名字 Select @sql=@sql+,sum(case when 科目=+科目+ then 成果 else 0 end) As +科目+         From 科目表 Print @sql set @sql=@sql+ From 表1 Group By 名字 Print @sql execute sp_executesql @sql 功德圆满。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章