`
isiqi
  • 浏览: 16538758 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

SQL对表格的行列转换

阅读更多

--行列互转
/*
*****************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂

整理人:中国风(Roy)

日期:2008.06.06
*****************************************************************************************************************************************************
*/

--1、行互列
--
> --> (Roy)生成測試數據

if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85
Go
--2000方法:
动态:

declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+' from Class group by [Student]')


生成静态:

select
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end)
from
Class
group by [Student]

GO
动态:

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')

生成静态:
select *
from
Class
pivot
(
max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b

生成格式:
/*
Student 数学 物理 英语 语文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
张三 87 90 82 78

(2 行受影响)
*/

------------------------------------------------------------------------------------------
go
--加上总成绩(学科平均分)

--2000方法:
动态:

declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+',[总成绩]=sum([Score]) from Class group by [Student]')--加多一列(学科平均分用avg([Score]))

生成动态:

select
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end),
[总成绩]=sum([Score]) --加多一列(学科平均分用avg([Score]))
from
Class
group by [Student]

go

--2005方法:

动态:

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一个逗号
exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a
pivot (max([Score]) for [Course] in(
'+@s+'))b ')

生成静态:

select
[Student],[数学],[物理],[英语],[语文],[总成绩]
from
(
select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])
pivot
(
max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b

生成格式:

/*
Student 数学 物理 英语 语文 总成绩
------- ----------- ----------- ----------- ----------- -----------
李四 77 85 65 65 292
张三 87 90 82 78 337

(2 行受影响)
*/

go

--2、列转行
--
> --> (Roy)生成測試數據

if not object_id('Class') is null
drop table Class
Go
Create table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)
Insert Class
select N'李四',77,85,65,65 union all
select N'张三',87,90,82,78
Go

--2000:

动态:

declare @s nvarchar(4000)
select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all
+',[Score]='+quotename(Name)+' from Class'
from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列
order by Colid
exec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序

生成静态:
select *
from (select [Student],[Course]='数学',[Score]=[数学] from Class union all
select [Student],[Course]='物理',[Score]=[物理] from Class union all
select [Student],[Course]='英语',[Score]=[英语] from Class union all
select [Student],[Course]='语文',[Score]=[语文] from Class)t
order by [Student],[Course]

go
--2005:

动态:

declare @s nvarchar(4000)
select @s=isnull(@s+',','')+quotename(Name)
from syscolumns where ID=object_id('Class') and Name not in('Student')
order by Colid
exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')

go
select
Student,
[Course],[Score]
from
Class
unpivot
(
[Score] for [Course] in([数学],[物理],[英语],[语文]))b

生成格式:
/*
Student Course Score
------- ------- -----------
李四 数学 77
李四 物理 85
李四 英语 65
李四 语文 65
张三 数学 87
张三 物理 90
张三 英语 82
张三 语文 78

(8 行受影响)
*/

分享到:
评论

相关推荐

    sql查询中行列转换

    ### SQL查询中的行列转换 在数据库管理中,经常会遇到数据结构需要调整的情况,尤其是当原始数据的排列方式与实际需求不一致时。本篇文章将详细解释如何通过一条SQL查询语句实现行列转换,并且会针对两种不同的SQL ...

    行列转换SQL存储过程代码

    ### 行列转换SQL存储过程代码解析 #### 核心知识点概述 本篇文章将深入探讨一个SQL存储过程的实现方式,该存储过程主要用于完成“行转列”(即行列转换)的操作。通过这种方式,可以有效地将数据库表中的行数据...

    Sql语句实现表的行列转换,行转列,列转行

    通过上述方法,我们成功地实现了表格数据的行列转换。这种方法不仅适用于本例中的简单情况,也可以扩展到更复杂的数据转换场景中。需要注意的是,在实际应用中还需要考虑数据量大小、性能等因素,合理选择合适的实现...

    SQL2000 和 SQL2005 下 行列转换 示例 - freeliver54 - 博客园.pdf

    行转列是一种常见的数据处理方式,用于将表格中的行数据转换为列数据,便于进一步的数据分析或展示。 #### 二、环境准备 - **SQL Server 2000** - **SQL Server 2005** #### 三、示例表结构及数据 首先,创建一...

    SQL行列转换 Pivot UnPivot

    SQL 行列转换是指将表格中的行数据转换为列数据,或者将列数据转换为行数据。Pivot 和 UnPivot 是 SQL Server 2005 中引入的两个语法,用于实现行列转换。 Pivot Pivot 语法的主要作用是将列值旋转为列名,即行转...

    Oracle中SQL语句行列之间相互转换

    在Oracle数据库中,有时我们需要将表格中的行转换为列或将列转换为行,这种操作被称为行列转换。这种转换对于数据分析、报表制作等场景非常有用。本文将详细介绍Oracle中如何进行行列转换,并提供实际的例子。 ####...

    ms sql 行列转换

    在SQL中,行列转换是一种常见的数据操作,尤其在数据分析和报表生成时十分有用。这个案例主要涉及了如何将数据从行格式转换为列格式,针对的是一个学生成绩表,其中包含姓名、科目和成绩三个字段。我们将分别介绍...

    sqlserver2005 行列转换实现方法

    在SQL Server 2005中,行与列之间的转换是一种常见的数据操作需求,尤其是在数据分析、报表生成或数据展示时。以下将详细讲解如何在SQL Server 2005中实现这种转换。 首先,我们来看两个示例表格:`Company` 和 `...

    SQL行列转换

    其中,SQL的行列转换是数据库操作中的一个重要概念,它允许我们根据需求将数据从行格式转换为列格式,或者从列格式转换为行格式。这种转换在报告、分析以及数据展示时尤其有用,因为它可以优化数据的可读性和分析...

    oracle行列转换总结

    在Oracle数据库中,行列转换是一项常用且强大的功能,它允许数据在不同的维度上进行转换,以便于数据分析和报告。本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`...

    sql表数据行列互换

    在数据库管理与数据分析领域,有时我们需要对表格中的数据进行特殊的处理,例如将行转换为列或将列转换为行,这样的操作被称为“行列互换”。这种需求通常出现在汇总报告、数据透视等场景下。本文将详细介绍如何在...

    SQLServer行列互转实现思路(聚合函数)

    在SQL Server中,行列互转是一种常见的数据处理需求,它能帮助我们以更直观的方式展示数据。本篇文章将深入探讨如何使用聚合函数Pivot和Unpivot来实现这一目标,特别是针对SQL Server数据库。 首先,让我们了解什么...

    sql行列转换[借鉴].pdf

    在SQL中,行列转换是一种常见的数据操作,用于将表格数据从行格式转换为列格式,或者反之。在给定的PDF文件中,涉及到的具体知识点主要包括以下几个方面: 1. **CASE语句**:在SQL查询中,`CASE`语句常用于进行条件...

    行列转换

    在IT领域,行列转换是一种常见的数据处理操作,...总的来说,行列转换是IT领域尤其是数据分析中的重要技巧,通过源码编写或使用特定工具,我们可以根据需求灵活地对数据进行布局调整,以达到最佳的数据处理和展示效果。

    table行列数据转换

    在IT领域,尤其是在数据分析和处理时,经常需要对数据进行行列转换,以便更好地适应不同的应用场景。C#作为广泛使用的编程语言,提供了丰富的库和方法来处理这类问题。本篇文章将详细探讨“table动态行列数据转换”...

    oracle行列转换

    在Oracle数据库中,进行行列转换是一项常见的数据处理需求,尤其当数据存储格式与最终报告或分析所需的格式不一致时。这种转换技术可以帮助我们将表格中的行数据转换为列数据,反之亦然,从而使得数据能够更好地适应...

    深入SQL中PIVOT 行列转换详解

    总的来说,SQL中的PIVOT和UNPIVOT是处理表格数据的强大工具,它们帮助我们以更直观的方式呈现数据,使得数据的分析和解释更为便捷。对于需要频繁处理复杂报表或者需要对数据进行多角度分析的场景,理解并熟练运用这...

    sql数据 见行列互换

    行转列是一种常见的数据重塑方法,它将原始表格中的某些列转换为新表格中的行,或者将某些行转换为新表格中的列。这种转换有助于数据分析和报表制作,因为它可以更直观地显示数据。在SQL中实现行转列可以通过多种...

    DBF表数据行列转换

    总的来说,DBF表数据的行列转换是一个涉及数据处理和编程技能的任务,需要对数据库概念、文件格式和特定编程语言有深入理解。对于那些不熟悉FoxPro或类似工具的用户,使用现代的数据分析软件和语言可能会更方便,...

Global site tag (gtag.js) - Google Analytics