Sql行列转换

合集下载

Sql的行列(纵横表)转换

Sql的行列(纵横表)转换

Sql的⾏列(纵横表)转换创建表scores⼀、传统的⾏列转换纵表转横表我们要转成的横表是这样⼦的:既然这个表只有两列,那么可以根据姓名进⾏分组。

先把姓名拼凑出来,后⾯的分数我们再想办法。

select姓名from scores group by 姓名结果:分析:1. 我们先拿到语⽂这个科⽬的分数。

既然我们⽤到了group by 语句,这⾥肯定要⽤聚合函数来求分数。

2. ⽽且我们只需要语⽂这⼀科的成绩,分组出来的⼀共有 3列,分别是语⽂、数学、物理。

那么就需要判断科⽬来取分数。

这⾥符合我们需求的 case 语句就登场了。

它和c#中switch-case 作⽤⼀样。

sql case 语句语法:case字段when 值1 then 结果when 值2 then 结果2...else默认结果endselect姓名,SUM(case课程 when '语⽂' then 分数else0 end) as语⽂from scores group by 姓名结果:既然语⽂的分数取到了,其他科⽬改变下条件就可以了。

完整的sql:select姓名,SUM(case课程 when '语⽂' then 分数else0 end) as语⽂,SUM(case课程 when '数学' then 分数else0 end) as数学,SUM(case课程 when '物理' then 分数else0 end) as物理from scores group by 姓名横表转纵表我们先把刚刚转好的表,插⼊⼀个新表Scores2中。

select姓名,SUM(case课程 when '语⽂' then 分数else0 end) as语⽂,SUM(case课程 when '数学' then 分数else0 end) as数学,SUM(case课程 when '物理' then 分数else0 end) as物理into scores2from scores group by 姓名我们也先把张三和李四的语⽂成绩查出来。

sql server行转列查询语句

sql server行转列查询语句

sql server行转列查询语句SQL Server是一种关系型数据库管理系统,它使用结构化查询语言(SQL)来管理和查询数据库。

在实际应用中,常常需要使用SQL Server的行转列查询语句,以便将一行数据转化为多列数据。

本文将介绍如何使用SQL Server的行转列查询语句来满足任务名称中描述的内容需求。

行转列查询通常用于将多行数据转换为一行,以便更好地展示和分析数据。

在SQL Server中,我们可以使用PIVOT关键字来实现行转列查询。

下面是一个示例,演示如何使用行转列查询从"orders"表中提取订单信息,其中每个订单占据一行,并将每个订单的详细信息显示为多列。

```sqlSELECT orderId, [1] as Product1, [2] as Product2, [3] as Product3FROM(SELECT orderId, productName, ROW_NUMBER() OVER(PARTITION BY orderId ORDER BY productId) as rowNumberFROM orders) AS srcPIVOT(MAX(productName)FOR rowNumber IN ([1], [2], [3])) AS piv;```在上述查询中,我们首先使用子查询获取每个订单的详细信息,并使用ROW_NUMBER函数为每个产品分配一个行号(rowNumber)。

然后,在主查询中,使用PIVOT关键字将行号作为列名,并将每个产品的名称作为行转列查询的结果。

这个示例中设定了只显示最多3个产品,你也可以根据实际需求设置更多的列。

如果你不确定应该设置多少列,也可以使用动态的行转列查询语句。

下面是一个示例,演示如何使用动态的行转列查询从"orders"表中提取订单信息,并根据实际订单数量动态生成列。

```sqlDECLARE @cols AS NVARCHAR(MAX)DECLARE @query AS NVARCHAR(MAX)SELECT @cols = STUFF((SELECT DISTINCT ',' +QUOTENAME(ROW_NUMBER() OVER(PARTITION BY orderId ORDER BY productId))FROM ordersFOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')SET @query = 'SELECT orderId, ' + @cols + ' FROM(SELECT orderId, productName, ROW_NUMBER() OVER(PARTITION BY orderId ORDER BY productId) as rowNumberFROM orders) xPIVOT(MAX(productName)FOR rowNumber IN (' + @cols + ')) p'EXECUTE (@query)```在上述查询中,我们首先使用STUFF函数和XML PATH子句动态生成描述不同行号的列名的SQL语句片段。

sql行列转换方法整理

sql行列转换方法整理

1.--行‎列转换原‎表: ‎姓名‎科目‎成绩‎‎‎张三‎语文‎ 8‎0‎‎张三‎‎数学‎90‎‎‎张三‎物理‎ 85‎‎‎李四‎语‎文‎85‎‎李‎四‎物理‎ 82‎‎‎李四‎英语‎ 9‎0‎‎李四‎‎政治‎70‎‎‎王五‎英语‎ 90‎转换后‎的表:‎姓名‎数‎学‎物理‎英语‎语文‎政‎治‎‎‎‎‎李四‎‎ 0 ‎‎ 82 ‎‎ 90 ‎‎85 ‎ 7‎0‎‎‎‎‎王五‎‎0 ‎‎ 0 ‎‎ 90 ‎‎0 ‎‎0‎‎‎‎‎张三‎‎90 ‎‎85 ‎‎ 0 ‎‎80 ‎‎0实例‎:cre‎a te t‎a ble ‎c j -‎-创建表c‎j(‎ ID‎‎ Int‎IDEN‎T ITY ‎(1,1)‎‎n ot n‎u ll, ‎--创建列‎I D,并且‎每次新增一‎条记录就会‎加1 ‎ Nam‎e‎Varc‎h ar(5‎0), ‎‎Subj‎e ct ‎V arch‎a r(50‎),‎ Res‎u lt ‎Int,‎‎ pri‎m ary ‎k ey (‎I D) ‎ -‎-定义ID‎为表cj的‎主键‎)‎;--T‎r unca‎t e ta‎b le c‎j--S‎e lect‎* fr‎o m cj‎Inse‎r t in‎t o cj‎Sele‎c t '张‎三','语‎文',80‎unio‎n all‎Sel‎e ct '‎张三','‎数学',9‎0 uni‎o n al‎lSel‎e ct '‎张三','‎物理',8‎5 uni‎o n al‎lSel‎e ct '‎李四','‎语文',8‎5 uni‎o n al‎lSel‎e ct '‎李四','‎物理',8‎2 uni‎o n al‎lSel‎e ct '‎李四','‎英语',9‎0 uni‎o n al‎lSel‎e ct '‎李四','‎政治',7‎0 uni‎o n al‎lSel‎e ct '‎王五','‎英语',9‎0--行‎列转换D‎e clar‎e @sq‎l var‎c har(‎8000)‎Set ‎@sql ‎= 'Se‎l ect ‎N ame ‎a s 姓名‎'Sel‎e ct @‎s ql =‎@sql‎+ ',‎s um(c‎a se S‎u bjec‎t whe‎n '''‎+Subj‎e ct+'‎'' th‎e n Re‎s ult ‎e lse ‎0 end‎) ['+‎S ubje‎c t+']‎'fro‎m (se‎l ect ‎d isti‎n ct S‎u bjec‎t fro‎m cj)‎as c‎j --‎把所有唯一‎的科目的名‎称都列举出‎来Sel‎e ct @‎s ql =‎@sql‎+' fr‎o m cj‎grou‎p by ‎n ame'‎‎2. 行列‎转换--合‎并原表:‎班级‎学‎号‎‎‎ 1‎‎‎1‎‎‎1 ‎‎ 2‎‎‎1 ‎‎ 3‎‎‎2 ‎‎ 1‎‎‎2 ‎‎ 2‎‎‎3 ‎‎ 1转‎换后的表:‎班级‎学号‎‎‎‎‎‎‎ 1‎ 1,‎2,3‎‎‎‎‎ 2 ‎1,2‎‎‎‎‎ 3 ‎ 1 ‎实例‎:Cre‎a te t‎a ble ‎C lass‎N o -‎-创建表C‎l assN‎o(‎ ID‎Int ‎I DENT‎I TY(1‎,1) ‎n ot n‎u ll, ‎--创建‎列ID,并‎且每次新增‎一条记录就‎会加1 ‎ Cl‎a ss ‎V arch‎a r(50‎), ‎--班级‎列‎Numb‎e r Va‎r char‎(50),‎ -‎-学号列‎ P‎r imar‎y Key‎(ID) ‎‎ --定‎义ID为表‎C lass‎N o的主键‎);-‎-Trun‎c ate ‎T able‎Clas‎s No-‎-Sele‎c t * ‎f rom ‎C lass‎N oIn‎s ert ‎I nto ‎C lass‎N oSe‎l ect ‎1,1 U‎n ion ‎a llS‎e lect‎1,2 ‎U nion‎all‎S elec‎t 1,3‎Unio‎n all‎Sele‎c t 2,‎1 Uni‎o n al‎lSel‎e ct 2‎,2 Un‎i on a‎l lSe‎l ect ‎3,1‎创建一个合‎并的函数‎--Dro‎p Fun‎c tion‎KFRe‎t urn‎C reat‎e Fun‎c tion‎KFRe‎t urn(‎@Clas‎s Var‎c har(‎50))‎R etur‎n s Va‎r char‎(8000‎)as ‎Begi‎nDec‎l are ‎@str ‎V arch‎a r(80‎00)S‎e t @s‎t r = ‎''Se‎l ect ‎@str ‎= @st‎r + c‎a st(N‎u mber‎as V‎a rcha‎r(50)‎) + ‎',' f‎r om C‎l assN‎o Whe‎r e Cl‎a ss =‎@Cla‎s sS‎e t @s‎t r = ‎S ubSt‎r ing(‎@str,‎1,len‎(@str‎)-1)En‎d--‎调用自定义‎函数得到结‎果Sel‎e ct D‎i stin‎c t Cl‎a ss,d‎b o.KF‎R etur‎n(Cla‎s s) F‎r om C‎l assN‎o3‎:列转行‎--Dro‎p Tab‎l e Co‎l umnT‎o Row‎C reat‎e tab‎l e Co‎l umnT‎o Row‎(‎I D In‎t IDE‎N TITY‎(1,1)‎ not‎null‎, --‎创建列ID‎,并且每次‎新增一条记‎录就会加1‎a‎ int‎,‎b in‎t,‎c i‎n t,‎ d ‎i nt,‎ e ‎int,‎f‎ int‎,‎g in‎t,‎h i‎n t,‎ Pri‎m ary ‎K ey(I‎D) ‎‎--定义I‎D为表Co‎l umnT‎o Row的‎主键‎)‎;--T‎r unca‎t e Ta‎b le C‎o lumn‎T oRow‎--S‎e lect‎* fr‎o m Co‎l umnT‎o Row‎I nser‎t Int‎o Col‎u mnTo‎R ow‎S elec‎t 15,‎9,1,0‎,1,2,‎4,2 U‎n ion ‎a llS‎e lect‎22,3‎4,44,‎5,6,7‎,8,7 ‎U nion‎all‎S elec‎t 33,‎44,55‎,66,7‎7,88,‎99,12‎Dec‎l are ‎@sql ‎V arch‎a r(80‎00)S‎e t @s‎q l = ‎''Se‎l ect ‎@sql ‎= @sq‎l + r‎t rim(‎n ame)‎+ ' ‎f rom ‎C olum‎n ToRo‎w uni‎o n al‎l Sel‎e ct '‎from‎SysC‎o lumn‎s Whe‎r e id‎= ob‎j ect_‎i d('C‎o lumn‎T oRow‎')Se‎t @sq‎l = S‎u bStr‎i ng(@‎s ql,1‎,len(‎@sql)‎-70)‎--70的‎长度就是这‎个字符串'‎f rom ‎C olum‎n ToRo‎w uni‎o n al‎l Sel‎e ct I‎D fro‎mCol‎u mnTo‎R ow u‎n ion ‎a ll S‎e lect‎',因为‎它会把ID‎这一列的值‎也算进去,‎所以要把它‎截掉Ex‎e c ('‎S elec‎t ' +‎@sql‎+ ' ‎f rom ‎C olum‎n ToRo‎w')‎4. 如‎何取得一个‎数据表的所‎有列名方‎法如下:先‎从syso‎b ject‎s系统表中‎取得数据表‎的syst‎e mid,‎然后再sy‎s colu‎m ns表中‎取得该数据‎表的所有列‎名。

sqlserver列转行最简单的方法

sqlserver列转行最简单的方法

sqlserver列转行最简单的方法SQL Server是一种常用的关系型数据库管理系统,它提供了许多强大的功能和工具,可以实现数据的高效存储和管理。

在SQL Server 中,有时候我们需要将列转换为行,这在某些情况下非常有用。

本文将介绍SQL Server中最简单的方法来实现列转行操作。

在SQL Server中,可以使用UNPIVOT关键字来实现列转行的功能。

UNPIVOT关键字用于将多个列合并成一个列,并将每个合并后的列与原始表中的其他列一起输出。

UNPIVOT关键字的语法如下:```SELECT 列名, 值FROM 表名UNPIVOT (值 FOR 列名 IN (列1, 列2, ...)) AS 别名```其中,列名是要输出的列的名称,值是列名对应的值,表名是要进行列转行操作的表的名称,列1、列2等是要转换的列的名称,别名是输出结果的别名。

下面我们通过一个示例来演示如何使用UNPIVOT关键字实现列转行操作。

假设我们有一个表名为students的表,包含了学生的姓名、语文成绩、数学成绩和英语成绩,如下所示:```CREATE TABLE students (姓名 VARCHAR(50),语文成绩 INT,数学成绩 INT,英语成绩 INT);INSERT INTO students (姓名, 语文成绩, 数学成绩, 英语成绩) VALUES ('张三', 85, 90, 95),('李四', 90, 95, 80),('王五', 80, 85, 90);```现在我们需要将该表转换为列名为科目、值为成绩的形式。

我们可以使用以下SQL语句实现:```SELECT 姓名, 科目, 成绩FROM studentsUNPIVOT (成绩 FOR 科目 IN (语文成绩, 数学成绩, 英语成绩)) ASu;```执行上述SQL语句后,将得到以下结果:```姓名科目成绩-----------------张三语文成绩 85张三数学成绩 90张三英语成绩 95李四语文成绩 90李四数学成绩 95李四英语成绩 80王五语文成绩 80王五数学成绩 85王五英语成绩 90```从结果中可以看出,原始表中的每一行被转换为了多行,每行包含了姓名、科目和成绩信息。

sql行转列,列转行

sql行转列,列转行

sql⾏转列,列转⾏⾏列互转复制代码create table test(id int,name varchar(20),quarter int,profile int)insert into test values(1,'a',1,1000)insert into test values(1,'a',2,2000)insert into test values(1,'a',3,4000)insert into test values(1,'a',4,5000)insert into test values(2,'b',1,3000)insert into test values(2,'b',2,3500)insert into test values(2,'b',3,4200)insert into test values(2,'b',4,5500)select * from test--⾏转列select id,name,[1] as"⼀季度",[2] as"⼆季度",[3] as"三季度",[4] as"四季度",[5] as"5"fromtestpivot(sum(profile)for quarter in([1],[2],[3],[4],[5]))as pvtcreate table test2(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)insert into test2 values(1,'a',1000,2000,4000,5000)insert into test2 values(2,'b',3000,3500,4200,5500)select * from test2--列转⾏select id,name,quarter,profilefromtest2unpivot(profilefor quarter in([Q1],[Q2],[Q3],[Q4]))as unpvt复制代码sql替换字符串 substring replace复制代码--例⼦1:update tbPersonalInfo set TrueName = replace(TrueName,substring(TrueName,2,4),'**') where ID = 1--例⼦2:update tbPersonalInfo set Mobile = replace(Mobile,substring(Mobile,4,11),'********') where ID = 1--例⼦3:update tbPersonalInfo set Email = replace(Email,'chinamobile','******') where ID = 1复制代码SQL查询⼀个表内相同纪录 having如果⼀个ID可以区分的话,可以这么写select * from表where ID in (select ID from表 group by ID having sum(1)>1)如果⼏个ID才能区分的话,可以这么写select * from表where ID1+ID2+ID3 in(select ID1+ID2+ID3 from表 group by ID1,ID2,ID3 having sum(1)>1)其他回答:数据表是zy_bho,想找出ZYH字段名相同的记录复制代码--⽅法1:SELECT *FROM zy_bho a WHERE EXISTS(SELECT 1 FROM zy_bho WHERE [PK] <> a.[PK] AND ZYH = a.ZYH)--⽅法2:select a.* from zy_bho a join zy_bho bon (a.[pk]<>b.[pk] and a.zyh=b.zyh)--⽅法3:select * from zy_bbo where zyh in(select zyh from zy_bbo group by zyh having count(zyh)>1)--其中pk是主键或是 unique的字段。

sql 的行列转换

sql 的行列转换

sql 的行列转换在 SQL 中进行行列转换是一种常见的数据操作,它可以将数据从行的形式转换为列的形式,或者从列的形式转换为行的形式。

下面是两种常见的行列转换方法:1. 使用 `PIVOT` 语句进行行列转换:`PIVOT` 是 SQL 中专门用于进行行列转换的语句。

它允许你将一个表中的行数据按照特定的列值进行分组,并将其他列的值转换为新的列。

下面是一个简单的示例,假设有一个名为 `sales` 的表,包含以下列:`product_id`、`category` 和 `quantity`。

```sqlSELECT category, SUM(quantity) AS total_quantityFROM salesGROUP BY category;```上述示例使用 `GROUP BY` 子句按照 `category` 列进行分组,并使用 `SUM` 函数计算每个分组的 `quantity` 列的总和。

2. 使用 `UNION ALL` 和子查询进行行列转换:有时候,你可能无法直接使用 `PIVOT` 语句进行行列转换,或者你需要更复杂的转换逻辑。

在这种情况下,可以使用 `UNION ALL` 和子查询来实现。

下面是一个示例,将一个包含员工信息的表转换为按部门和职位分类的交叉表。

```sqlSELECT department, job_title, COUNT(*) AS countFROM employeesGROUP BY department, job_title;SELECT department, 'All Jobs' AS job_title, COUNT(*) AS countFROM employeesGROUP BY department;```上述示例使用了两个子查询,一个按照 `department` 和 `job_title` 进行分组,另一个按照 `department` 进行分组,并将所有职位都归为一个名为 `All Jobs` 的虚拟职位。

T-SQL行列转换

T-SQL行列转换

T-SQL行列转换行列转换,通常有2种方法,一是CASE WHEN/UNION;一是PIVOT/UNPIVOT。

对于行值或列数不固定的情况,需要用动态SQL。

一. 行转列123456789101112131415161718--drop table RowToCol create table RowToCol(ID int,Code varchar(10), Value int)Goinsert RowToColselect 1,'Item1',1000 union all select 1,'Item2',1000 union all select 1,'Item3',500 union all select 2,'Item1',2000 union all select 2,'Item2',0 union all select 3,'Item1',1000 union all select 3,'Item3',500GOselect * from RowToCol要得到这样的结果:IDItem1Item2Item311000100050022000310005001. CASE WHEN在SQL Server 2000时,常用的写法,沿用至今。

(1) 静态1234567891011select ID,sum(case Code when 'Item1' then Value else 0 end) as Item1,sum(case Code when 'Item2' then Value else 0 end) as Item2,sum(case Code when 'Item3' then Value else 0 end) as Item3from RowToCol group by ID--或者用max也行select ID,max(case Code when 'Item1' then Value else 0 end) as Item1,max(case Code when 'Item2' then Value else 0 end) as Item2,max(case Code when 'Item3' then Value else 0 end) as Item3from RowToCol group by ID(2) 动态在不确定有多少行需要转为列时,先distinct出待转列的值,再拼出包含若干个CASE的SQL语句,然后运行。

sql行列(转换)操作

sql行列(转换)操作
union all select ''粮食'',''麦子'',25,''10/4''
select * from #t
动态的:
declare @sql nvarchar(4000)
select @sql=N''select splb,spm''
select @sql=@sql+'',sum(case when chr=''''''+chr+'''''' then sl else 0 end) as [''+chr+'']''
drop table t2
create table t2(id int,pid int)
insert into t2 values(1,1)
insert into t2 values(1,2)
insert into t2 values(1,3)
insert into t2 values(2,1)
想变成
姓名 语文 数学 英语
张三 80 86 75
李四 78 85 78
动态的:
declare @sql varchar(8000)
set @sql = ''select name''
select @sql = @sql + '',sum(case km when ''''''+km+'''''' then cj end) [''+km+'']''

sql行列转换Pivotunpivot)

sql行列转换Pivotunpivot)

sql行列转换Pivotunpivot)sql 行列转换 Pivot/unpivot)如您所知,关系表是表格化的,即,它们以列-值对的形式出现。

假设一个表名为CUSTOMERS。

SQL> desc customersName Null? Type----------------------------------------- -------- ---------------------------CUST_ID NUMBER(10)CUST_NAME VARCHAR2(20)STATE_CODE VARCHAR2(2)TIMES_PURCHASED NUMBER(3)选定该表:select cust_id, state_code, times_purchasedfrom customersorder by cust_id;输出结果如下:CUST_ID STATE_CODE TIMES_PURCHASED------- ---------- ---------------1 CT 12 NY 103 NJ 24 NY 4...and so on ...注意数据是如何以行值的形式显示的:针对每个客户,该记录显示了客户所在的州以及该客户在商店购物的次数。

当该客户从商店购买更多物品时,列 times_purchased 会进行更新。

现在,假设您希望统计一个报表,以了解各个州的购买频率,即,各个州有多少客户只购物一次、两次、三次等等。

如果使用常规 SQL,您可以执行以下语句:select state_code, times_purchased, count(1) cntfrom customersgroup by state_code, times_purchased;输出如下:ST TIMES_PURCHASED CNT-- --------------- ----------CT 0 90CT 1 165CT 2 179CT 3 173CT 4 173CT 5 152...and so on ...这就是您所要的信息,但是看起来不太方便。

sql行转列的几种方法

sql行转列的几种方法

sql行转列的几种方法SQL语言中,行转列是一种常见的数据转换操作,用于将行数据转换为列数据,以便更方便地进行数据分析和统计。

在实际的数据处理中,行转列操作有多种方法可以实现,本文将介绍其中的几种常用方法。

一、使用CASE语句CASE语句是SQL语言中的条件表达式,可以根据条件返回不同的结果。

在行转列操作中,可以使用CASE语句将多个行数据转换为对应的列数据。

例如,有一个表格包含了员工的姓名和所属部门信息,现在要将部门信息转换为列数据,可以使用如下的SQL语句:```SELECT姓名,CASE WHEN 部门 = '部门A' THEN '是' ELSE '否' END AS 部门A,CASE WHEN 部门 = '部门B' THEN '是' ELSE '否' END AS 部门B,CASE WHEN 部门 = '部门C' THEN '是' ELSE '否' END AS 部门CFROM员工表;```上述SQL语句将根据不同的部门信息,将结果集中的部门列转换为对应的列数据,输出每个员工所属部门的信息。

二、使用PIVOT函数PIVOT函数是一种高级的行转列操作方法,在某些数据库中支持。

该函数可以将行数据转换为列数据,并实现数据的聚合操作。

例如,有一个表格包含了销售人员的姓名、所属部门和销售额信息,现在要将销售额按照部门进行汇总,并将部门数据转换为列数据,可以使用如下的SQL语句:```SELECT姓名,[部门A] AS 部门A销售额,[部门B] AS 部门B销售额,[部门C] AS 部门C销售额FROM(SELECT姓名,部门,销售额FROM销售表) AS 原始数据PIVOT(SUM(销售额)FOR 部门 IN ([部门A], [部门B], [部门C])) AS 转换后的数据;```上述SQL语句中,使用了PIVOT函数将原始数据按照部门进行汇总,并将部门数据转换为列数据,输出每个销售人员在不同部门的销售额信息。

sql列转行的实现方法

sql列转行的实现方法

sql列转行的实现方法在数据库操作中,有时需要将表格中的列转换为行。

这种转换通常用于数据分析和报表生成。

SQL(结构化查询语言)是用于操作数据库的标准语言,因此,掌握如何使用SQL进行列转行是非常重要的。

一、列转行的概念列转行是将数据库表格中的一列或多列数据转换为新的行数据的过程。

在转换后的表格中,每个数据项都被视为一个新的行,行标题为原始数据列的名称。

这个过程可以方便地对单一或多个列的数据进行进一步的分析和处理。

二、实现方法下面介绍几种常用的SQL语句来实现列转行的方法:1. 使用PIVOT语句PIVOT语句是一种非常有用的方法,可以将数据库表格中的列转换为行。

通过使用PIVOT语句,可以将具有相同值的列组合在一起,并将它们转换为新的行。

语法如下:```sqlSELECT 列名, 新行数据FROM 表格名PIVOT (聚合函数(原列名)FOR 原列名 IN (值1, 值2, 值3, ...)) AS pivotTable;```"quantity"两列数据。

可以使用以下语句将这两列转换为行:```sqlSELECT product, quantity AS revenueFROM salesPIVOT (SUM(quantity)FOR product IN ([产品1], [产品2], [产品3]) -- 替换为实际的产品名称列表) AS pivotTable;```这将返回一个包含每个产品名称和对应销售数量的新表格。

2. 使用UNPIVOT语句与PIVOT语句相反,UNPIVOT语句将行数据转换为列。

语法如下:```sqlSELECT 原列名, 新列名FROM 表格名UNPIVOT (原列数据 FOR 原列名 IN (值1, 值2, 值3, ...) ) AS unpivotTable;```和"quantity"两列数据,以及一个名为"revenue"的新列数据。

SQL将一列转换成一行,并将这一行形成新的列

SQL将一列转换成一行,并将这一行形成新的列

SQL将⼀列转换成⼀⾏,并将这⼀⾏形成新的列SQL部分-----1. .查询出来要转换的数据SELECT name FROM dbo.base_pay_type WHERE is_enabled = 1数据如图:2.将查询到的数据转换成⾏,以逗号隔开,以【】包裹SELECT STUFF((SELECT '[' + name + '],'FROM(SELECT name FROM dbo.base_pay_type WHERE is_enabled = 1) a FOR XML PATH('') ), 1,0, '') AS Name如图:3,去掉最后⼀个逗号SELECT LEFT(,LEN()-1) AS Name FROM (SELECT STUFF((SELECT '[' + name + '],'FROM(SELECT name FROM dbo.base_pay_type WHERE is_enabled = 1) a FOR XML PATH('') ), 1,0, '') AS Name ) AS a如图:4,这⼀⾏形成新的列,⽤PIVOT实现SELECT * FROM (select sellerid,pay_type_name,cast(sum(amount) as decimal(18,2)) as payamout from (SELECT distinct oi.order_guid,ss.SellerId, AS pay_type_name,op.amountFROM dbo.shop_sellers AS ssLEFT JOIN dbo.order_item oi ON ss.SellerId=oi.tracking_idLEFT JOIN dbo.order_list ol ON ol.order_guid = oi.order_guidLEFT JOIN dbo.order_pay op ON ol.order_guid=op.order_guidLEFT JOIN dbo.base_pay_type bs ON op.pay_type_id=bs.pay_type_idINNER JOIN dbo.shops s ON s.ShopGuid=ol.ownerWHERE bs.is_enabled=1 AND op.is_received=1 AND order_status='finished' and pay_status='paid'and s.ShopId IN(SELECT ShopId FROM dbo.shops WHERE 1=1 and shopid=15 or ParentShopId=15)AND ol.order_time between '2018-01-17' and '2018-08-17 23:59:59') aGROUP BY SellerId,pay_type_name) AS PA PIVOT(MAX( payamout ) FORpay_type_name IN ([现⾦],[⽀付宝],[微信⽀付],[会员卡],[康品汇会员卡],[银联扫码⽀付]))PPA如图:C#后台代码,先将⼀列转换成⼀⾏,以逗号隔开,【】包裹string SQL = "SELECT LEFT(,LEN()-1) AS Name FROM (SELECT STUFF((SELECT '[' + name + '],'FROM(SELECT name FROM dbo.base_pay_type WHERE is_enabled = 1) a FOR XML PATH('') ), 1, 0, '') AS Name ) AS a"; DataTable dt = dbAccess.ExecuteTable(SQL);string filwes = dt.Rows[0]["name"].ToString();得到的结果如上⾯标题3,然后拼接SQL,将filwes作为参数输⼊下⾯SQL语句SELECT * FROM (select sellerid,pay_type_name,cast(sum(amount) as decimal(18,2)) as payamout from (SELECT distinct oi.order_guid,ss.SellerId, AS pay_type_name,op.amountFROM dbo.shop_sellers AS ssLEFT JOIN dbo.order_item oi ON ss.SellerId=oi.tracking_idLEFT JOIN dbo.order_list ol ON ol.order_guid = oi.order_guidLEFT JOIN dbo.order_pay op ON ol.order_guid=op.order_guidLEFT JOIN dbo.base_pay_type bs ON op.pay_type_id=bs.pay_type_idINNER JOIN dbo.shops s ON s.ShopGuid=ol.ownerWHERE bs.is_enabled=1 AND op.is_received=1 AND order_status='finished' and pay_status='paid'and s.ShopId IN(SELECT ShopId FROM dbo.shops WHERE 1=1 {1}) {2}) aGROUP BY SellerId,pay_type_name) AS PA PIVOT(MAX( payamout ) FOR pay_type_name IN (‘“+filwes+”’))PPA。

SQL语句的行列转换

SQL语句的行列转换

SQL语句的⾏列转换【⼀】⾏转列1,查询原始的数据/***这次练习的主题,⾏转列,列转⾏***/select * from Scores2,得到姓名,通过group byselect Student as '姓名'from Scoresgroup by Studentorder by Student3,再加上max, case……whenselect Student as '姓名',max(case Subject when '语⽂' then Score else 0 end) as '语⽂' ,--如果这个⾏是“语⽂”,就选此⾏作为列max(case Subject when '英语' then Score else 0 end ) as '英语'from Scoresgroup by Studentorder by Student查看其它资料时,看到另外⼀种⽅法,⽤pivot--group by, avg/max, pivot。

这⾥⽤max和avg,结果都⼀样,有什么区别吗?有点不明⽩--参考⽹上的资料,⽤法如下/*pivot( 聚合函数(要转成列值的列名) for 要转换的列 in(⽬标列名) )*/select Student as '姓名',avg(语⽂) as '语⽂',avg(英语) as '英语'from Scorespivot(avg(Score) for Subjectin (语⽂,英语))as NewScoresgroup by Studentorder by Student asc。

sql server行转列查询语句

sql server行转列查询语句

sql server行转列查询语句SQL Server行转列查询语句是一种非常有用的查询技巧,可以将一行的数据转换为多列的形式,这对于某些业务场景非常实用。

本文将详细介绍SQL Server行转列查询语句的使用方法和注意事项,希望能帮助读者更好地掌握这一技巧。

一、什么是行转列查询语句行转列查询语句是一种将一行数据转换为多列数据的查询技巧。

在数据库中,数据通常以行的形式存储,每一行代表一个记录。

但是在某些场景下,我们需要将行数据转换为列数据,以便更好地展示和处理数据。

SQL Server提供了一些函数和关键字来实现行转列查询。

二、行转列查询的应用场景行转列查询常见的应用场景包括以下几种:1. 交叉表查询:将某一列的值作为新列,将另一列的值作为新行,用于统计和分析数据。

2. 报表生成:将多行数据按照某个字段进行分组,转换为多列数据,方便生成报表。

3. 数据展示:将一张表中的多行数据转换为一行数据,用于展示和查询。

三、行转列查询的基本语法SQL Server中实现行转列查询通常使用PIVOT和UNPIVOT关键字。

下面是行转列查询的基本语法:1. PIVOT语法:SELECT [列1], [列2], ...FROM [表名]PIVOT(聚合函数([列名])FOR [列名] IN ([列值1], [列值2], ...)) AS [别名]2. UNPIVOT语法:SELECT [列名], [值]FROM [表名]UNPIVOT([值] FOR [列名] IN ([列1], [列2], ...)) AS [别名]需要注意的是,PIVOT语句中的聚合函数可以是SUM、COUNT、AVG 等,适用于需要对数据进行统计的场景。

四、行转列查询的实际案例为了更好地理解行转列查询,下面以一个实际案例来演示如何使用行转列查询语句。

我们有一个销售数据表sales_data,包含以下列:产品名称(product_name)、区域(region)、销售额(sales_amount)。

SQL行转列

SQL行转列
2. 数据如下
INSERT INTO #TmpTable( RYear, JQty, FQty, MQty, AQty ) SELECT T.RYear,T.JQty,T.FQty,T.MQty,T.AQty FROM ( SELECT 2011 RYear,1 JQty,2 FQty,3 MQty,4 AQty UNION ALL SELECT 2011 RYear,1 JQty,2 FQty,3 MQty,4 AQty UNION ALL SELECT 2010 RYear,1 JQty,2 FQty,3 MQty,4 AQty UNION ALL SELECT 2010 RYear,1 JQty,2 FQty,3 MQty,4 AQty )T
4. 转 转换的SQL
SELECT RYear,'Jan' RMonth,SUM(JQty) Qty FROM #TmpTable GROUP BY RYear UNION ALL SELECT RYear,'Feb' RMonth,SUM(FQty) Qty FROM #TmpTable GROUP BY RYear UNION ALL SELECT RYear,'Mar' RMonth,SUM(MQty) Qty FROM #TmpTable GROUP BY RYear UNION ALL SELECT RYear,'Apr' RMonth,SUM(AQty) Qty FROM #TmpTable GROUP BY RYear
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
SQL行 转 列
1. 创建临时表

SQL行转列和列转行代码详解

SQL行转列和列转行代码详解

SQL⾏转列和列转⾏代码详解⾏列互转,是⼀个经常遇到的需求。

实现的⽅法,有case when⽅式和2005之后的内置pivot和unpivot⽅法来实现。

在读了技术内幕那⼀节后,虽说这些解决⽅案早就⽤过了,却没有系统性的认识和总结过。

为了加深认识,再总结⼀次。

⾏列互转,可以分为静态互转,即事先就知道要处理多少⾏(列);动态互转,事先不知道处理多少⾏(列)。

--创建测试环境USE tempdb;GOIF OBJECT_ID('dbo.Orders') IS NOT NULLDROP TABLE dbo.Orders;GOCREATE TABLE dbo.Orders(orderid int NOT NULL PRIMARY KEY NONCLUSTERED,orderdate datetime NOT NULL,empid int NOT NULL,custid varchar(5) NOT NULL,qty int NOT NULL);CREATE UNIQUE CLUSTERED INDEX idx_orderdate_orderidON dbo.Orders(orderdate, orderid);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(30001, '20020802', 3, 'A', 10);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(10001, '20021224', 1, 'A', 12);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(10005, '20021224', 1, 'B', 20);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(40001, '20030109', 4, 'A', 40);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(10006, '20030118', 1, 'C', 14);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(20001, '20030212', 2, 'B', 12);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(40005, '20040212', 4, 'A', 10);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(20002, '20040216', 2, 'C', 20);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(30003, '20040418', 3, 'B', 15);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(30004, '20020418', 3, 'C', 22);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)VALUES(30007, '20020907', 3, 'D', 30);GO⾏转列-静态⽅案:--⾏转列的静态⽅案⼀:CASE WHEN,兼容sql2000select custid,sum(case when YEAR(orderdate)=2002 then qty end) as [2002],sum(case when YEAR(orderdate)=2003 then qty end) as [2003],sum(case when YEAR(orderdate)=2004 then qty end) as [2004]from ordersgroup by custid;GO--⾏转列的静态⽅案⼆:PIVOT,sql2005及以后版本select *from (select custid,YEAR(orderdate) as years,qty from orders) as ordpivot(sum(qty) for years in([2002],[2003],[2004]))as pGO⾏转列-动态⽅案:加⼊了xml处理和SQL注⼊预防判断--既然是⽤到了动态SQL,就有⼀个⽼话题:SQL注⼊。

sql函数 行转列聚合

sql函数 行转列聚合

sql函数行转列聚合SQL函数之行转列聚合在SQL查询中,经常遇到需要将行数据转换为列数据进行聚合的情况。

这种操作可以通过SQL函数来实现,它能够将原始数据表中的行数据通过聚合操作转换为表的列。

本篇文章将逐步回答关于SQL函数行转列聚合的问题。

1. 什么是行转列聚合?行转列聚合是指将原始数据表中的行数据按照某种方式转换为列数据,并进行聚合操作。

例如,如果我们有一个包含学生信息的数据表,每个学生有不同的课程成绩,我们可以将每个学生的成绩按照课程转换为列,并对每个学生的成绩进行聚合操作,如求平均值、最大值或最小值。

2. 如何实现行转列聚合?在SQL中,我们可以使用多种函数来实现行转列聚合。

其中一种常用的函数是PIVOT函数。

PIVOT函数可以将原始数据表的行数据转换为列数据,并进行聚合操作。

使用PIVOT函数,我们需要指定用于转换的列和进行聚合操作的列。

然后,我们可以选择使用聚合函数(如求和、平均值、最大值或最小值)对转换后的列进行计算。

3. PIVOT函数的语法是什么样的?PIVOT函数的语法如下所示:sqlSELECT 列1, 列2, ...FROM 原始数据表PIVOT( 聚合函数(转换列)FOR 转换列IN (转换值1, 转换值2, ...)) AS 聚合后的数据表其中,列1、列2等代表我们需要查询的列,并非转换后的列。

原始数据表是我们要从中转换数据的表名。

聚合函数是我们要对转换后的列进行的操作,可以是求和、平均值、最大值或最小值等。

转换列是我们要进行转换的列。

转换值是转换列中的具体数值。

4. 举个例子说明一下行转列聚合的使用场景和实现方法。

假设我们有一个名为"students"的数据表,其中包含三个列:姓名、课程和成绩。

我们想要将每个学生的成绩转换为列,并计算他们的平均分。

我们可以通过如下的SQL查询来实现:sqlSELECT 姓名, [语文], [数学], [英语]FROM studentsPIVOT (AVG(成绩)FOR 课程IN ([语文], [数学], [英语])) AS 平均分这个查询会将原始数据表中每个学生的语文、数学和英语成绩转换为列,并计算每个学生的平均分。

SQL行转列

SQL行转列

SQL⾏转列1、创建样例⽤数据表CREATE TABLE [dbo].[OCFOrderDetail]([Id] [int] IDENTITY(1,1) NOT NULL,[CustomerCode] [varchar](10) NULL,[ConsingerCode] [varchar](10) NULL,[OrderMonth] [datetime] NULL,[OrderQTY] [int] NULL,[PO_NO] [varchar](10) NULL,CONSTRAINT [PK_OCFOrderDetail] PRIMARY KEY CLUSTERED([Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GOSET ANSI_PADDING OFFGOSET IDENTITY_INSERT [dbo].[OCFOrderDetail] ONINSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (1, N'0001-00', N'0001-00', CAST(N'2021-01-01 00:00:00.000' AS DateTime), 100, N'20210101')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (2, N'0001-00', N'0001-00', CAST(N'2021-02-01 00:00:00.000' AS DateTime), 100, N'20210201')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (3, N'0001-00', N'0001-00', CAST(N'2021-03-01 00:00:00.000' AS DateTime), 100, N'20210301')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (4, N'0001-00', N'0001-00', CAST(N'2021-04-01 00:00:00.000' AS DateTime), 100, N'20210401')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (5, N'0002-00', N'0002-00', CAST(N'2021-01-01 00:00:00.000' AS DateTime), 100, N'20210101')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (6, N'0002-00', N'0002-00', CAST(N'2021-02-01 00:00:00.000' AS DateTime), 100, N'20210201')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (7, N'0002-00', N'0002-00', CAST(N'2021-03-01 00:00:00.000' AS DateTime), 100, N'20210301')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (8, N'0003-00', N'0003-00', CAST(N'2021-01-01 00:00:00.000' AS DateTime), 100, N'20210101')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (9, N'0003-00', N'0003-00', CAST(N'2021-02-01 00:00:00.000' AS DateTime), 100, N'20210201')INSERT [dbo].[OCFOrderDetail] ([Id], [CustomerCode], [ConsingerCode], [OrderMonth], [OrderQTY], [PO_NO]) VALUES (10, N'0003-00', N'0003-00', CAST(N'2021-04-01 00:00:00.000' AS DateTime), 100, N'20210401')SET IDENTITY_INSERT [dbo].[OCFOrderDetail] OFF2、实例的进化演⽰--1)PIVOT固定⾏转列SELECT [CustomerCode],[ConsingerCode],[20210101],[20210201],[20210301],[20210401]FROM [OCFOrderDetail]PIVOT(sum(OrderQTY) For [PO_NO] in ([20210101],[20210201],[20210301],[20210401])) t--2)灵活获取订单⽉部分Select ',['+m+']' From (Select Distinct Substring(Convert(varchar(10),OrderMonth,112),1,6) AS mFrom [OCFOrderDetail]) tFor xml path('')--3)删除开头的,并转换为字符串Select Stuff((Select ',['+m1+']'From (Select Distinct Substring(Convert(varchar(10),OrderMonth,112),1,8) AS m1From [OCFOrderDetail]) t For xml path('')),1,1,'')--4)PIVOT灵活⾏转列Declare @monthStr varchar(Max)Declare @sqlStr varchar(Max)Set @monthStr=Stuff((Select ',['+m1+']'From (Select Distinct Substring(Convert(varchar(10),OrderMonth,112),1,8) AS m1From [DBStudy].[dbo].[OCFOrderDetail]) t For xml path('')),1,1,'')set @sqlStr='Select [CustomerCode],[ConsingerCode],'+@monthStr+' FROM [OCFOrderDetail] PIVOT(sum(OrderQTY) For [PO_NO] in ('+@monthStr+')) t'Exec(@sqlStr)。

SQL行转列

SQL行转列

SQL⾏转列⾏转列,列转⾏是我们在开发过程中经常碰到的问题。

1、⾏转列⼀般通过CASE WHEN 语句来实现2、也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。

⽤传统的⽅法,⽐较好理解。

层次清晰,⽽且⽐较习惯。

但是PIVOT 、UNPIVOT提供的语法⽐⼀系列复杂的SELECT...CASE 语句中所指定的语法更简单、更具可读性。

下⾯我们通过⼏个简单的例⼦来介绍⼀下列转⾏、⾏转列问题。

⼀、⾏转列我们⾸先先通过⼀个⽼⽣常谈的例⼦,学⽣成绩表(下⾯简化了些)来形象了解下⾏转列CREATE TABLE[StudentScores]([UserName]NVARCHAR(20), --学⽣姓名[Subject]NVARCHAR(30), --科⽬[Score]FLOAT, --成绩)插⼊数据INSERT INTO[StudentScores]SELECT'Nick', '语⽂', 80INSERT INTO[StudentScores]SELECT'Nick', '数学', 90INSERT INTO[StudentScores]SELECT'Nick', '英语', 70INSERT INTO[StudentScores]SELECT'Nick', '⽣物', 85INSERT INTO[StudentScores]SELECT'Kent', '语⽂', 80INSERT INTO[StudentScores]SELECT'Kent', '数学', 90INSERT INTO[StudentScores]SELECT'Kent', '英语', 70INSERT INTO[StudentScores]SELECT'Kent', '⽣物', 85View Code如果我想知道每位学⽣的每科成绩,⽽且每个学⽣的全部成绩排成⼀⾏,这样⽅便我查看、统计,导出数据1、case when ⽅式SELECTUserName,MAX(CASE Subject WHEN'语⽂'THEN Score ELSE0END) AS'语⽂',MAX(CASE Subject WHEN'数学'THEN Score ELSE0END) AS'数学',MAX(CASE Subject WHEN'英语'THEN Score ELSE0END) AS'英语',MAX(CASE Subject WHEN'⽣物'THEN Score ELSE0END) AS'⽣物'FROM dbo.[StudentScores]GROUP BY UserName查询结果如图所⽰,这样我们就能很清楚的了解每位学⽣所有的成绩了2、PIVOT⽅式SELECT*FROM[StudentScores]/*数据源*/AS PPIVOT(SUM(Score/*⾏转列后列的值*/) FORp.Subject/*需要⾏转列的列*/IN ([语⽂],[数学],[英语],[⽣物]/*列的值*/)) AS T另举⼀例做解释:SELECT[星期⼀],[星期⼆],[星期三],[星期四],[星期五],[星期六],[星期⽇]--这⾥是PIVOT第三步(选择⾏转列后的结果集的列)这⾥可以⽤“*”表⽰选择所有列,也可以只选择某些列(也就是某些天),通过TBL来定义列的别名FROM WEEK_INCOME--这⾥是PIVOT第⼆步骤(准备原始的查询结果,因为PIVOT是对⼀个原始的查询结果集进⾏转换操作,所以先查询⼀个结果集出来)这⾥可以是⼀个select⼦查询,--但为⼦查询时候要指定别名,否则语法错误PIVOT(SUM(INCOME) for[week]in([星期⼀],[星期⼆],[星期三],[星期四],[星期五],[星期六],[星期⽇])--这⾥是PIVOT第⼀步骤,也是核⼼的地⽅,进⾏⾏转列操作。

sql 行转列函数

sql 行转列函数

sql 行转列函数SQL转列函数是一种从一个SQL询结果集的行记录,转换成多个列的技术。

它可以使你从 SQL据库中获取完整的行记录,并将它们分解成不同的列,这样你就可以对任何数据进行更细粒度的控制。

SQL转列函数的类型有哪些?SQL 中的行转列函数有很多种,常见的行转列函数包括:UNPIVOT,PIVOT,CROSS APPLY,RANK,ROW_NUMBER,STUFF,CAST,TRANSLATE,TRIM,DENSE_RANK,FILTER,LEAD LAG。

UNPIVOT数是什么?UNPIVOT数用于将表中的行转换成列。

它可以将表中的指定列的行记录转换成多个列,这使得你可以查看每个列的具体数据内容。

例如,假设有一个用户评价表,其中包含不同用户对某产品的打分情况,如下:| UserName | Product1 | Product2 | Product3 ||----------|----------|----------|----------|| John | 5 | 4 | 3 || Mary | 4 | 3 | 2 | 使用 UNPIVOT数,可以将上述行转列,转换成如下形式:| UserName | ProductName | Rating ||----------|-------------|--------|| John | Product1 | 5 || John | Product2 | 4 || John | Product3 | 3 || Mary | Product1 | 4 || Mary | Product2 | 3 || Mary | Product3 | 2 |PIVOT数又是什么?PIVOT数是一种可以将表中的行转换成列的函数。

它可以将表中的指定列的行记录转换成多个列,这使得你可以查看每个列的具体数据内容。

例如,假设有一个用户评价表,其中包含不同用户对某产品的打分情况,如下:| UserName | Product1 | Product2 | Product3 ||----------|----------|----------|----------|| John | 5 | 4 | 3 || Mary | 4 | 3 | 2 | 使用 PIVOT数,可以将上述行转列,转换成如下形式:| ProductName | John | Mary ||-------------|------|------|| Product1 | 5 | 4 || Product2 | 4 | 3 || Product3 | 3 | 2 |CROSS APPLY数又是什么?CROSS APPLY数是一种相对比较复杂的行转列函数,它不仅可以将表中的行转换成列,而且可以将表中指定列的行记录转换成多个列,与 PIVOT UNPIVOT比,CROSS APPLY持多表查询,而且支持复杂的查询条件,这使得它可以返回更丰富和有用的查询结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[StuID] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[StuName] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[KeCheng] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
002 李四 数学 72.0
002 李四 语文 82.0
*/
/*
-- Sql 2000 下 行列转换
SELECT StuName,
'语文' = Sum(Case KeCheng WHEN '语文' THEN ChengJi ELSE 0 END ) ,
-- 结果
StuName 语文 数学 历史
李四 82.0 72.0 72.0
张三 81.0 71.0 71.0
*/
/*
-- Sql 2005 下 PIVOT
SELECT StuName,[语文] AS '语文',
[数学] AS '数学',[历史] AS '历史'
SQL2000 和 SQL20源自5 下 行列转换 示例 1.创建 学生成绩表
2.填充 部分数据
3.一般的直接查询
4.Sql 2000 下 行列转换
5.Sql 2005 下 PIVOT
------------
/*
--创建 学生成绩表
CREATE TABLE [StuSources] (
FROM StuSources s
PIVOT (SUM (ChengJi) FOR KeCheng IN ([语文],[数学],[历史]) )AS pvt
*/
'数学' = Sum(Case KeCheng WHEN '数学' THEN ChengJi ELSE 0 END ),
'历史' = Sum(Case KeCheng WHEN '历史' THEN ChengJi ELSE 0 END )
FROM StuSources
GROUP BY StuName
[ChengJi] [float] NOT NULL
) ON [PRIMARY]
*/
/*
--填充 部分数据
INSERT INTO StuSources
SELECT '001','张三','语文',81
UNION SELECT '001','张三','数学',71
UNION SELECT '001','张三','历史',71
UNION SELECT '002','李四','语文',82
UNION SELECT '002','李四','数学',72
UNION SELECT '002','李四','历史',72
*/
/*
-- 一般的直接查询
SELECT * FROM StuSources
-- 结果
StuID StuName KeCheng ChengJi
001 张三 历史 71.0
001 张三 数学 71.0
001 张三 语文 81.0
002 李四 历史 72.0
相关文档
最新文档