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环境下编译通过。

### EPUB 文件中实现从竖排横排的布局转换 在处理 EPUB 文件中的布局转换时,可以利用 CSS 和 HTML 的特性来调整页面的方向和排列方式。以下是具体方法: #### 使用 CSS 控制方向 通过设置 `writing-mode` 属性,可以在 EPUB 中定义文字的书写模式。对于竖排横排的需求,可以通过修改该属性完成。 - **竖排布局**对应的 CSS 是 `writing-mode: vertical-rl;` 或者 `writing-mode: tb-rl;`[^1]。 - **横排布局**则对应于 `writing-mode: horizontal-tb;` 或默认值 `writing-mode: lr-tb;`。 因此,要将竖排布局转换横排布局,只需找到控制样式的地方(通常是 `.css` 文件),并将上述属性更改为适合横排的形式。 ```css /* 原始竖排 */ body { writing-mode: vertical-rl; } /* 修改后的横排 */ body { writing-mode: horizontal-tb; } ``` #### 利用阅读器功能切换 部分 EPUB 阅读器提供了内置的功能用于快速更改显示模式。例如 Lovely Reader 支持四种不同的阅读方式:横排多栏、横排单栏、竖排多栏以及竖排单栏[^2]。如果希望手动操作而不编辑源文件,则可以选择合适的选项以满足需求。 需要注意的是,某些高级自定义可能依赖 Adobe Air 组件的支持才能正常工作,所以在尝试前应确认设备已安装必要环境。 #### 自动化脚本辅助 当面对大量文档或者频繁换场景时,编写自动化脚本来批量替换指定标签内的写作风格会更加高效。下面是一个简单 Python 脚本示例,展示如何遍历并更新所有 `<style>` 标签下的规则: ```python import re def convert_writing_mode(epub_content): pattern = r'writing\-mode\s*:\s*(vertical|tb)\-[a-z]+;' replacement = 'writing-mode: horizontal-tb;' updated_content = re.sub(pattern, replacement, epub_content) return updated_content # 示例调用 with open('example.epub', 'r', encoding='utf-8') as file: content = file.read() new_content = convert_writing_mode(content) with open('converted_example.epub', 'w', encoding='utf-8') as output_file: output_file.write(new_content) ``` 此代码片段能够识别目标字符串,并将其替换成适用于横向编排的新声明形式。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值