sql查询语句行转列的高效写法

简介:

/*

Create Table cj

(

姓名 varchar(10),

学科 varchar(10),

分数 Int

)

INSERT INTO cj (姓名,学科,分数) values (N'张三',N'语文',80)

INSERT INTO cj (姓名,学科,分数) values (N'张三',N'数学',90)

INSERT INTO cj (姓名,学科,分数) values (N'张三',N'外语',85)

INSERT INTO cj (姓名,学科,分数) values (N'李四',N'语文',81)

INSERT INTO cj (姓名,学科,分数) values (N'李四',N'数学',85)

INSERT INTO cj (姓名,学科,分数) values (N'李四',N'外语',90)

INSERT INTO cj (姓名,学科,分数) values (N'李四',N'体育',90)

INSERT INTO cj (姓名,学科,分数) values (N'王五',N'体育',98)

INSERT INTO cj (姓名,学科,分数) values (N'赵六',N'物理',90)

INSERT INTO cj (姓名,学科,分数) values (N'赵六',N'生物',98)

INSERT INTO cj (姓名,学科,分数) values (N'Bruce',N'生物',95)

INSERT INTO cj (姓名,学科,分数) values (N'Bruce',N'体育',97)

INSERT INTO cj (姓名,学科,分数) values (N'Bruce',N'语文',99)

INSERT INTO cj (姓名,学科,分数) values (N'Bruce',N'数学',100)

INSERT INTO cj (姓名,学科,分数) values (N'Bruce',N'外语',95)

INSERT INTO cj (姓名,学科,分数) values (N'Bruce',N'物理',99)

*/

------静态写法(适合学科比较少的)

Select *,语文+数学+外语 As '总分' Into #Tmp From(

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 cj Group By 姓名) T

Select * From #Tmp Union

Select '总分',Sum(语文),Sum(数学),Sum(外语),Sum(总分) From #Tmp

Drop Table #Tmp

-----动态写法(不管有多少学科都可以,如大学里每个人选修的课程不一样,且课程数量比较多)

Declare @sql varchar(4000)--行转列的SQL

Declare @RightSum varchar(2000)--右边求和的SQL

Declare @BottomSum varchar(2000)--底部求和的SQL

---1、SQL:先把行转成列,并插入一个新表临时表#T1

Set @sql = ' Select * Into #T1 From (Select 姓名,'

Select @sql = @sql + 'Sum(Case 学科 When '''+学科+''' Then 分数 Else 0 End) as '''+学科+''','

From (Select Distinct 学科 From cj) As a

Select @sql = Left(@sql,len(@sql)-1) +' From cj group by 姓名) Y '

---2、SQL:从T1求右边和并插入临时表#T2中

Set @RightSum=' Select *,'

Select @RightSum=@RightSum+''+学科+'+'

From (Select Distinct 学科 From cj) As b

Select @RightSum = Left(@RightSum,len(@RightSum)-1) + ' As ''总分'' Into #T2 From #T1 '

---3、SQL:列出所有及求底部和

Set @BottomSum=' Select * From #T2 Union Select ''总分'','

Select @BottomSum=@BottomSum+'Sum('+学科+'),'

From (Select Distinct 学科 From cj) As b

Select @BottomSum = Left(@BottomSum,len(@BottomSum)-2) + '),sum(总分) From #T2'

---4、执行

Exec(@sql+@RightSum+@BottomSum)---连接顺序:1、@sql 2、@RightSum 3、@BottomSum

---输出查看语句

Pr

int @sql

Print @RightSum

Print @BottomSum

/*

如果要单步执行,则不能用临时表,把#T1、#T2的#去掉即可。这是因为单步执行完成后临时表也就被删除了:

--1、

Exec (@sql)

--2、

Exec(@RightSum)

--3、

Exec(@BottomSum)

--4、执行完后删除表

Drop Table T1

Drop Table T2

建议不要单步执行,因为会产生实体表(T1、T2),如果多人同时访问时就会出问题;而用临时表(#T1、#T2)多人同时访问时互不影响。

*/











本文转自51GT51CTO博客,原文链接:http://blog.51cto.com/yataigp/2062525 ,如需转载请自行联系原作者


相关文章
|
15天前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
13天前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
13天前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
90 35
|
2月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
188 77
|
1月前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
|
24天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
35 1
|
10天前
|
SQL 缓存 关系型数据库
SQL为什么不建议执行多表关联查询
本文探讨了SQL中不建议执行多表关联查询的原因,特别是MySQL与PG在多表关联上的区别。MySQL仅支持嵌套循环连接,而不支持排序-合并连接和散列连接,因此在多表(超过3张)关联查询时效率较低。文章还分析了多表关联查询与多次单表查询的效率对比,指出将关联操作放在Service层处理的优势,包括减少数据库计算资源消耗、提高缓存效率、降低锁竞争以及更易于分布式扩展等。最后,通过实例展示了如何分解关联查询以优化性能。
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
70 17
|
2月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
1月前
|
SQL 数据可视化 IDE
SQL做数据分析的困境,查询语言无法回答的真相
SQL 在简单数据分析任务中表现良好,但面对复杂需求时显得力不从心。例如,统计新用户第二天的留存率或连续活跃用户的计算,SQL 需要嵌套子查询和复杂关联,代码冗长难懂。Python 虽更灵活,但仍需变通思路,复杂度较高。相比之下,SPL(Structured Process Language)语法简洁、支持有序计算和分组子集保留,具备强大的交互性和调试功能,适合处理复杂的深度数据分析任务。SPL 已开源免费,是数据分析师的更好选择。

热门文章

最新文章