`
tianshizhilei
  • 浏览: 81284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sql查询 竖排变横排及横排变竖排显示 行列转换问题

阅读更多

假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文  74
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94
-------------------------------------------------------------------------
想变成
姓名         语文        数学        物理         
---------- ----------- ----------- -----------
李四         74          84          94
张三         74          83          93

create table tb
(
   Name    varchar2(10) ,
   Subject varchar2(10) ,
   Result  number
);
insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
  (case subject when '语文' then result else 0 end) 语文,
  (case subject when '数学' then result else 0 end) 数学,
  (case subject when '物理' then result else 0 end) 物理
from tb

case的括号前可加数据统计函数,如max,sum等
max(case subject when '语文' then result else 0 end) 语文--语文最高分
sum(case subject when '语文' then result else 0 end) 语文--语文成绩之和(适合竖排有重复列的情况)

--动态SQL,指subject不止语文、数学、物理这三门课程。
create or replace procedure test as
declare @sql varchar2(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql);

加个平均分,总分

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理,
  cast(avg(result*1.0) as decimal(18,2)) 平均分,
  sum(result) 总分
from tb
group by name

--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1)

drop table tb;

---------------------------------------------------------
--如果上述两表互相换一下:即横排变竖排

姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94

想变成
Name       Subject Result     
---------- ------- -----------
李四         语文      74
李四         数学      84
李四         物理      94
张三         语文      74
张三         数学      83
张三         物理      93

create table tb1
(
   姓名 varchar2(10) ,
   语文 number ,
   数学 number ,
   物理 number
);
insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93);
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94);

select * from
(
  select 姓名 as Name ,'语文' , 语文 from tb1
  union all
  select 姓名 as Name , '数学' ,数学 from tb1
  union all
  select 姓名 as Name , '物理' , 物理 from tb1
) t
order by name

drop table tb1;

以上在oralce 9i环境下编译通过。

 

以上是网上找的,但是实际运行是出现了多列,有0的情况,其实SQL语句要这样写的
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理
from tb group by  name;

结果才是这个:

姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    易语言 超级列表框 横排 and 竖排+数据库例子 源码

    在易语言中,超级列表框提供了横排和竖排两种显示模式,使得数据的展示更加灵活多样。横排通常用于展示数据的不同列,而竖排则用于展示数据的多个行。源码示例将展示如何根据需求切换这两种模式,以适应不同的用户...

    excel表格如何把横排变成竖排.doc

    Excel表格中文字竖排和横排的转换技巧 Excel表格中,文字竖排和横排的转换是非常常见的操作。今天,我们将分享三种不同的方法来实现文字竖排和横排的转换。 方法一:利用文字方向来实现竖排 在Excel中,用户可以...

    横排文字转古书式竖排工具

    这款工具正是为了解决现代与传统的转换问题而诞生。 该工具的设计理念在于便捷和高效。用户只需将需要转换的文字复制粘贴到工具的输入框内,点击转换按钮,即可快速得到竖排文字。对于论坛发帖者来说,它可以帮助...

    易语言源码竖排古文转换器易语言源码.rar

    易语言源码竖排古文转换器易语言源码.rar 易语言源码竖排古文转换器易语言源码.rar 易语言源码竖排古文转换器易语言源码.rar 易语言源码竖排古文转换器易语言源码.rar 易语言源码竖排古文转换器易语言源码.rar ...

    竖排按钮显示

    总之,WPF的灵活性和强大的布局系统使得实现竖排按钮显示变得简单易行。通过StackPanel、TextBlock属性设置以及数据绑定,我们可以创建出具有独特视觉效果的用户界面。在实际的WpfApplication2项目中,你可以进一步...

    UltraEdit中将一竖行数据转换为横行

    UltraEdit中将一竖行数据转换为横行 UltraEdit中将一竖行数据转换为横行 UltraEdit中将一竖行数据转换为横行

    c# 另一个读书过程中自己写的练习程序--文字竖排工具

    3. **字符串处理**:竖排文字需要将横排的文字逐行反转,涉及到字符串的截取、拼接操作。C#中的String类提供了丰富的字符串操作方法,如Substring()用于获取子字符串,PadRight()用于填充字符以达到指定长度。 4. *...

    BAT批处理脚本-汉字横排变竖排---转置.zip

    在本案例中,我们关注的是一个名为“汉字横排变竖排---转置.bat”的批处理脚本,它显然设计用于将文本中的汉字从横向排列转换为竖向排列,这是一个在文本处理中可能遇到的独特需求。 批处理脚本的工作原理是读取...

    Linux下横排文档换竖排.pdf

    在传统的文字处理编辑器中,文字通常以横排的方式显示,但有时用户可能需要将文档转换为竖排,以便于阅读或特殊布局。例如,在制作一些传统文献或书法作品时,竖排模式会更为合适。Microsoft Office 4.0(在Windows...

    界面的横排竖排

    #### 屏幕适配原理及实践 在开发Android应用程序时,面对多种分辨率和尺寸的设备,如何确保应用能够良好地运行在每一款设备上是一项重要的技术挑战。本文通过案例讲解了Android应用如何实现对不同屏幕尺寸的支持。 ...

    c++ 日历 横排 竖排输出

    本程序不使用类来实现,而是利用结构体或简单的变量管理日期信息,通过函数来完成横排和竖排的日历输出。 首先,我们需要了解年份、月份和日期之间的关系。在C++中,可以定义一个结构体`Date`来存储年、月、日,...

    竖排古文(论坛发帖好助手)

    这个软件的主要功能是将输入的现代横排文字转换为传统的竖排古文格式,使得文章在视觉上更具有古典韵味,适合在各种论坛或社交媒体上分享。 在古代,由于书写材料如竹简、丝绸的限制,文字通常是从右至左,自上而下...

    精美首页横排美化 for phpwind7.3.2.rar

    【标题】"精美首页横排美化 for phpwind7.3.2.rar" 是一个专为phpwind 7.3.2版本设计的网站界面优化插件。这个压缩包包含了一系列文件,旨在提升phpwind论坛首页的视觉效果,将内容以横排的方式呈现,从而提供更加...

    易语言竖排古文转换器

    易语言竖排古文转换器源码,竖排古文转换器

    文字竖排编辑器

    【文字竖排编辑器】是一种特别的文本编辑工具,它不同于传统的横排文本,而是将文字按照垂直方向进行排列。这种编辑器在某些特定场景下非常有用,比如书法排版、古籍整理或是艺术设计等领域。本文将详细介绍该编辑器...

    PowerPoint打印设置 讲义 竖排6个幻灯片.docx

    用户可以根据需要选择不同的打印模式,例如竖排版或横排版。 2. 讲义模式打印:讲义模式打印是指将 PowerPoint 幻灯片打印到同一页纸上,以便制作讲义或其他印刷品。在讲义模式下,用户可以选择竖排版或横排版的...

    javascript横排竖排标准选项卡效果代码

    从提供的文件信息中,我们可以提炼出关于“javascript横排竖排标准选项卡效果代码”的相关知识点,下面将详细说明这些知识点。 首先,横排竖排标准选项卡是网页设计中常见的交互组件,用于在有限的屏幕上展示更多的...

    javascript横排竖排标准选项卡效果代码.docx

    ### JavaScript 横排竖排标准选项卡效果代码解析 #### 一、概述 本文将详细介绍如何使用JavaScript结合HTML和CSS实现横排竖排标准选项卡效果。此效果广泛应用于网页设计中,能够帮助用户更好地浏览和切换不同的...

    竖排古文转换器易语言源码

    "竖排古文转换器"是一款利用易语言编写的软件,其主要功能是将文本中的古文内容从横排转换为竖排,以符合传统古籍的阅读习惯。这种转换器在处理古代文献、诗词或者对联等竖写格式时非常有用。 源码是程序设计的基础...

    竖排古文软件V1.1中文免费绿色版

    竖排古文软件V1.1是一款专为中文用户设计的免费绿色应用软件,主要功能是将普通横排的文字转换成传统的竖排显示方式,以此满足对古文阅读或者传统排版需求的用户。该软件操作简便,适用于各种文本转换场景,尤其适合...

Global site tag (gtag.js) - Google Analytics