普通行列转换
假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
*/
--
-----------------------------------------------------------------------
/*
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/
create
table
tb
(
Name
varchar
(
10
) ,
Subject
varchar
(
10
) ,
Result
int
)
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
)
go
--
静态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
) 物理
from
tb
group
by
name
/*
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/
--
动态SQL,指subject不止语文、数学、物理这三门课程。
declare
@sql
varchar
(
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
)
/*
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 84 94 74
张三 83 93 74
*/
--
-----------------------------------------------------------------
/*
加个平均分,总分
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/
--
静态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
/*
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/
--
动态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
)
/*
姓名 数学 物理 语文 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 84 94 74 84.00 252
张三 83 93 74 83.33 250
*/
drop
table
tb
--
-------------------------------------------------------
--
-------------------------------------------------------
/*
如果上述两表互相换一下:即
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成
Name Subject Result
---------- ------- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
*/
create
table
tb1
(
姓名
varchar
(
10
) ,
语文
int
,
数学
int
,
物理
int
)
insert
into
tb1(姓名 , 语文 , 数学 , 物理)
values
(
'
张三
'
,
74
,
83
,
93
)
insert
into
tb1(姓名 , 语文 , 数学 , 物理)
values
(
'
李四
'
,
74
,
84
,
94
)
select
*
from
(
select
姓名
as
Name , Subject
=
'
语文
'
, Result
=
语文
from
tb1
union
all
select
姓名
as
Name , Subject
=
'
数学
'
, Result
=
数学
from
tb1
union
all
select
姓名
as
Name , Subject
=
'
物理
'
, Result
=
物理
from
tb1
) t
order
by
name ,
case
Subject
when
'
语文
'
then
1
when
'
数学
'
then
2
when
'
物理
'
then
3
when
'
总分
'
then
4
end
--
------------------------------------------------------------------
/*
加个平均分,总分
Name Subject Result
---------- ------- --------------------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
*/
select
*
from
(
select
姓名
as
Name , Subject
=
'
语文
'
, Result
=
语文
from
tb1
union
all
select
姓名
as
Name , Subject
=
'
数学
'
, Result
=
数学
from
tb1
union
all
select
姓名
as
Name , Subject
=
'
物理
'
, Result
=
物理
from
tb1
union
all
select
姓名
as
Name , Subject
=
'
平均分
'
, Result
=
cast
((语文
+
数学
+
物理)
*
1.0
/
3
as
decimal
(
18
,
2
))
from
tb1
union
all
select
姓名
as
Name , Subject
=
'
总分
'
, Result
=
语文
+
数学
+
物理
from
tb1
) t
order
by
name ,
case
Subject
when
'
语文
'
then
1
when
'
数学
'
then
2
when
'
物理
'
then
3
when
'
平均分
'
then
4
when
'
总分
'
then
5
end
drop
table
tb1
分享到:
相关推荐
通过下载提供的`Oracle补充内容_行列转换.sql`文件,你可以看到具体的SQL示例和实际操作,这将帮助你更好地理解和掌握Oracle的行列转换技巧。在实践中,理解并熟练运用这些技术,将有助于你更有效地处理和展示数据,...
本文将详细介绍如何在Oracle中使用DECODE和CASE语句进行横表转纵表的操作。 首先,我们需要理解横表和纵表的概念。横表是列数多行数少的数据结构,而纵表则是行数多列数少,通常用于将具有相同类别但不同属性的数据...
oracle行列转换示例,查询转换,有创表过程,数据,清晰明了
本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...
在Oracle数据库中,有时我们需要将表格中的行转换为列或将列转换为行,这种操作被称为行列转换。这种转换对于数据分析、报表制作等场景非常有用。本文将详细介绍Oracle中如何进行行列转换,并提供实际的例子。 ####...
Oracle 行列转换是指将数据库表中的行转换为列或将列转换为行的一种操作。这种操作在实际应用中非常有用,例如在数据报表生成、数据分析和数据挖掘等领域。下面我们将详细介绍 Oracle 行列转换的六种情况。 一、列...
【Oracle 行列转换实例】 在数据库管理中,有时我们需要将数据表的行与列进行转换,以便于数据分析和报表展示。Oracle 提供了一种高效的方法,即使用分析函数来实现这种行列转换。分析函数主要设计用于处理累计计算...
在Oracle SQL中,行列转换是一种常见的数据操作需求,主要用于将数据表中的行转换为列,或将列转换为行,以此来满足不同的数据展示或分析需求。这种转换在处理多维度数据、汇总数据或是进行复杂查询时特别有用。下面...
在Oracle数据库中,行列转换是一种常见的数据操作需求,主要用于改变数据的展示格式,使得数据能够更好地适应特定的分析或报告需求。本文将详细介绍如何在Oracle中实现行转列(即行列转换的一种)以及列转行的操作,...
本文档将详细讲解Oracle数据库中的行列转换方法,并通过具体实例来说明每一种转换方式的应用场景。 #### 二、列转行 **2.1 使用 UNION ALL 实现列转行** 适用于Oracle 8i、9i、10g及以上版本。 - **步骤与示例**...
通过上述示例,我们可以看到在Oracle数据库中实现行列转换的方法是可行且有效的。这种方法不仅可以提高数据展示的清晰度,还能够在一定程度上简化复杂的数据查询任务。然而,在实际应用中还需要注意动态SQL所带来的...
### Oracle 行列转换知识点详解 #### 一、概述 在数据库操作中,有时需要将数据从行格式转换为列格式或反之亦然,这种需求通常被称为“行列转换”。Oracle 提供了多种方法来实现这样的转换,适用于不同的场景。本文...
Oracle中的行列转换也提供了多种方法,其中最为常用的是使用`CASE`语句和`PIVOT`操作。 ##### 1. 使用 `CASE` 语句 在Oracle中使用`CASE`语句的方式与SQLServer类似,但需要注意Oracle中`CASE`语句的写法有所不同...
在Oracle数据库管理中,数据处理有时需要将行数据转换为列数据,或者将列数据转换为行数据,这种操作被称为行列转换。Oracle 10g 提供了多种方法来实现这种转换,包括使用PIVOT和UNPIVOT操作,以及自定义SQL查询等。...
行列转换是数据库查询中一项非常实用的功能,主要用于改变数据的展示形式,即将原始数据表中的行数据转换为列数据,或将列数据转换为行数据。这种转换在数据分析、报表制作等领域极为常见。 #### 二、行列转换的...
在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中的行数据转换为列数据的情况,这种操作被称为“行转列”或者“行列转换”。行列转换是数据分析、报表生成等场景中非常常见的需求之一。本文将详细介绍几种...
在提供的 A.sql 和 B.sql 文件中,可能包含了实际的 SQL 查询示例,这些示例可以进一步解释如何在具体的场景下执行行列转换。分析这些脚本可以帮助理解 MySQL 在处理此类问题时的具体语法和逻辑。 在实际工作中,...
本篇文章将通过一个具体的Java面试题目,详细介绍如何在Oracle和SQL Server两种数据库环境下实现行列转换,并给出具体的示例代码。 #### 二、需求分析与设计 假设我们有一个成绩表`sc`,表结构如下: - `sid`: ...