sql行转列

SQL:行转列、合并行

◇◆丶佛笑我妖孽 提交于 2020-03-04 20:19:03
Sql split函数: /*分割一定格式的数据源 以数据表的形式返回 */ CREATE function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(F1 varchar(100)) as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@SourceSql) while @i>=1 begin insert @temp values(left(@SourceSql,@i-1)) set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i) set @i=charindex(@StrSeprate,@SourceSql) end if @SourceSql<>'' insert @temp values(@SourceSql) return end 行转列: select identity(int ,1,1) as rownum1 ,F1 as F1 into #tmp1 from dbo.f_splitstr('1,2,3,4',',') declare @sql

SQL行转列汇总

点点圈 提交于 2020-03-03 14:53:12
PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 ) SQL2008 中可以直接使用 完整语法: View Code UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现 View Code 典型实例 一、行转列 1、建立表格 IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb go CREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT) insert into tb VALUES ('张三','语文',74) insert into tb VALUES ('张三','数学',83) insert into tb VALUES ('张三','物理',93) insert into tb VALUES ('李四','语文',74) insert into tb VALUES ('李四','数学',84) insert into tb VALUES (

SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行

别等时光非礼了梦想. 提交于 2020-01-19 02:40:12
ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。 【注】对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。有关如何设置数据库兼容级别的信息,请参阅 sp_dbcmptlevel (Transact-SQL)。 A,PIVOT 语法 返回顶部 1、 PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。 以下是带批注的 PIVOT 语法。 SELECT <非透视的列>, [第一个透视的列] AS <列名称>, [第二个透视的列] AS <列名称>, ... [最后一个透视的列] AS <列名称>, FROM (<生成数据的 SELECT 查询>) AS <源查询的别名> PIVOT ( <聚合函数>(<要聚合的列>) FOR [

Sql Server 行转列、列转行

﹥>﹥吖頭↗ 提交于 2020-01-11 02:20:35
创建表: CREATE TABLE [dbo].[tbl_Student]( [ID] [int] IDENTITY(1,1) NOT NULL, [学生ID] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [学生姓名] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL, [课程ID] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL, [课程名称] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL, [成绩] [int] NULL, [教师ID] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [教师姓名] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY] 插入数据: insert into tbl_Student values('S3','王五','K4 ','政治',53,'T4','赵老师');insert into tbl_Student values('S1',' 张三 ','K1 ','数学',61,'T1','张老师');insert into tbl_Student values('S2'

sql 动态行转列 的例子

心不动则不痛 提交于 2020-01-09 17:01:00
--键一张临时表 create table #t ( 名字 varchar(20), 课程 varchar(20), 分数 int ) insert into #t values('张三','数学','88') insert into #t values('张三','语文','99') insert into #t values('张三','英语','77') insert into #t values('李四','语文','77') insert into #t values('李四','数学','88') insert into #t values('李四','英语','99') insert into #t values('王五','英语','99') insert into #t values('李四','化学 ','99') select * from #t--查询圆表数据 ------行转列 declare @sql varchar(8000) set @sql = 'select 名字 ' select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']' from (select distinct 课程 from #t) as a set @sql =

sql 行转列

余生颓废 提交于 2020-01-09 04:52:07
首先引用一篇博文地址: http://www.cnblogs.com/luluping/archive/2009/07/24/1530611.html 主要是通过动态组合case语句来生成sql,并动态执行。 个人在此照着碎碎念一下: 首先:如何从一个数据集中组合生成多分支的case? 比如:select distinct subject from studentcj ,该语句执行结果返回'语文'、'数学','物理'等3条记录。 而我们要生成的case语句应该是这样的: case subject when ' 语文 ' then result end , -- case when subject='语文' then result end case subject when ' 数学 ' then result end , case subject when ' 物理 ' then result end 其中,subject的值不确定就是这3种,数目不固定,因此,我们就需要动态的来构建这条sql语句了。 由于我们要从多条记录中生成一条语句,因此,我们要使用select,而不是set, 具体sql如下: 代码 declare @sql varchar ( 2000 ) set @sql = '' select @sql = @sql + ' ,case subject when ' +

SQL Server 行转列

我的梦境 提交于 2020-01-09 04:42:06
语法: PIVOT 用于将列值旋转为列名(即行转列),在SQL Server 2000 可以用聚合函数配合 CASE 语句实现 PIVOT 的一般语法是: PIVOT ( 聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数( value_column ) FOR pivot_column IN(<column_list>) ) UNPIVOT 用于将列明转为列值(即列转行),在 SQL Server 2000 可以用 UNION 来实现 完整语法: table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库 兼容级别 在数据库属性->选项->兼容级别改为 90 ----------------------------------------------------------------------------------------- 华丽的分隔符 -------------------------------------------------------------------------------------------------

SQL查询 行转列横向显示

一笑奈何 提交于 2020-01-01 07:23:34
/* 问题:假设有张学生成绩表 (tb) 如下 : 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成 ( 得到如下结果 ) : 姓名 语文 数学 物理 ---- ---- ---- ---- 李四 74 84 94 张三 74 83 93 ------------------- */ create table tb( 姓名 varchar ( 10 ) , 课程 varchar ( 10 ) , 分数 int ) insert into tb values ( ' 张三 ' , ' 语文 ' , 74 ) insert into tb values ( ' 张三 ' , ' 数学 ' , 83 ) insert into tb values ( ' 张三 ' , ' 物理 ' , 93 ) insert into tb values ( ' 李四 ' , ' 语文 ' , 74 ) insert into tb values ( ' 李四 ' , ' 数学 ' , 84 ) insert into tb values ( ' 李四 ' , ' 物理 ' , 94 ) go --SQL SERVER 2000 静态 SQL, 指课程只有语文、数学、物理这三门课程。 ( 以下同 ) select 姓名

SQL 行转列

余生颓废 提交于 2019-12-18 13:28:32
SQL 行转列 假设一个工厂里有n种零件,现在按照零件的种类进行编组,为零件录入条形码。 插入数据 查询 行 行转列 结果 假设一个工厂里有n种零件,现在按照零件的种类进行编组,为零件录入条形码。 插入数据 insert into Warehouse values(‘A1’,‘CA1004322’,‘Q100000’) insert into Warehouse values(‘A2’,‘CB1003113’,‘Q100000’) insert into Warehouse values(‘A3’,‘CC1003422’,‘Q100000’) insert into Warehouse values(‘A4’,‘CD1002432’,‘Q100000’) insert into Warehouse values(‘A5’,‘CE1000432’,‘Q100000’) insert into Warehouse values(‘A6’,‘CF1000045’,‘Q100000’) insert into Warehouse values(‘A7’,‘CG10043242’,‘Q1000003’) insert into Warehouse values(‘A8’,‘CH10031413’,‘Q1000003’) insert into Warehouse values(‘A9’,

行转列笔记

空扰寡人 提交于 2019-12-18 07:51:44
DECLARE @sql VARCHAR (MAX),@sql2 VARCHAR (MAX),@sql3 VARCHAR (MAX) --设置行转列字段 SELECT @sql = '' SELECT @sql = @sql + ',' + '[' + rtrim (b.bugno) + ']' FROM (SELECT DISTINCT q.bugno,qd.bugname FROM qaaETmxb q right JOIN dbo.QAAqdmxb qd ON q.bugno=qd.bugno WHERE q.bugno<>'') b SELECT @sql=STUFF(@sql, 1 , 1, '') --求和 行转列的字段 SELECT @sql3 = '' SELECT @sql3 = @sql3 + ',' + 'SUM([' + rtrim (b.bugno) + ']) [' + rtrim (b.bugname) + ']' FROM (SELECT DISTINCT q.bugno,qd.bugname FROM qaaETmxb q right JOIN dbo.QAAqdmxb qd ON q.bugno=qd.bugno WHERE q.bugno<>'') b SELECT @sql3 = STUFF(@sql3, 1 , 1, '') SELECT