上次做活的时候碰到客户提的一个需求,就是要把数据库中得列转化为行来显示。呵呵,自己网上也找了一些解决方案,加上自己的一个解决方案,做一个总结,以免下次再碰到这种情况,也算是一种经验的积累把。
create database arron
go
use arron
go
-- createTable init Data
create table students (
name varchar(25),
class varchar(25),
grade int
)
insert into students values ('张三','语文',20)
insert into students values ('张三','数学',90)
insert into students values ('张三','英语',50)
insert into students values ('李四','语文',81)
insert into students values ('李四','数学',60)
insert into students values ('李四','英语',90)
-- solution1
select * from students
pivot(
max(grade)
FOR [class] IN ([语文],[数学],[英语])
) AS pvt
-- solution2 相当于自连接
select A.Name,A.grade as 语文,B.grade as 数学,C.grade as 英语
from students A,students B,students C
where A.Name=B.Name and B.Name=C.Name
and A.class='语文' and B.class='数学'
and C.class='英语'
-- solution3
select name,
max(case when s.class='语文' then s.grade end) as 语文,
max(case when s.class='数学' then s.grade end) as 数学,
max(case when s.class='英语' then s.grade end) as 英语
from students s group by name
--在有id 的情况下
create table students2 (
id int primary key identity(1,1),
name varchar(25),
class varchar(25),
grade int
)
insert into students2 values ('张三','语文',20)
insert into students2 values ('张三','数学',90)
insert into students2 values ('张三','英语',50)
insert into students2 values ('李四','语文',81)
insert into students2 values ('李四','数学',60)
insert into students2 values ('李四','英语',90)
-- 原先的solution1(有问题)
select * from students2
pivot(
max(grade)
FOR [class] IN ([语文],[数学],[英语])
) AS pvt
-- 原先的solution2 (ok)
select A.Name,A.grade as 语文,B.grade as 数学,C.grade as 英语
from students A,students2 B,students2 C
where A.Name=B.Name and B.Name=C.Name
and A.class='语文' and B.class='数学'
and C.class='英语'
-- 原先的solution3 (ok)
select name,
max(case when s.class='语文' then s.grade end) as 语文,
max(case when s.class='数学' then s.grade end) as 数学,
max(case when s.class='英语' then s.grade end) as 英语
from students s group by name
--unpivot 函数使用
create table test1(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
insert into test1 values(1,'a',1000,2000,4000,5000)
insert into test1 values(2,'b',3000,3500,4200,5500)
--实现的sql
select * from test1
select id ,[name],[jidu],[xiaoshou] from test1
unpivot
(
xiaoshou for jidu in
([q1],[q2],[q3],[q4])
)
as f
--- 以下的sql 可以替换上面的sql
select id,[name],
jidu='Q1',
xiaoshou=(select Q1 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu='Q2',
xiaoshou=(select Q2 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu='Q3',
xiaoshou=(select Q3 from test1 where id=a.id)
from test1 as a
union
select id,[name],
jidu='Q4',
xiaoshou=(select Q4 from test1 where id=a.id)
from test1 as a
分享到:
相关推荐
可根据关键字符将一列分成多行显示,例如 A B 1 1.1.2 拆分成 1 1 1 1 1 2 进行相关的显示
### SQL中的列行转换技术详解 #### 一、引言 在处理数据库查询时,我们经常需要对数据进行各种各样的转换,以便更好地满足业务需求。其中,“列行转换”是一种非常实用的技术,它能够帮助我们将表格中的列数据转换...
在SQL数据库操作中,行与列的转换是常见的数据处理需求。这通常涉及到将一列的数据拆分成多行,或者将多行数据合并为一列。这种操作在数据分析、报表生成以及数据清洗过程中非常常见。在SQL Server中,我们可以利用...
在SQL中,将列转换为行的操作通常被称为“行列转换”或“透视”操作,它在数据处理中非常常见,特别是在报表制作和数据分析时。以下将详细介绍两种主要的方法:使用`UNION ALL`和`CASE WHEN`语句,以及使用`PIVOT`...
2. 用PIVOT把行转换为列 SELECT [20100717],[20100718],[20100719],[20100720],[20100721],[20100722],[20100723] FROM SHIP PIVOT ( SUM(SHPQTY) FOR SHPDAT IN ([20100717],[20100718],[20100719],[20100720],...
它们能够将行转换成列或将列转换成行,以便于进行数据分析和报告。 数据透视(PIVOT)操作允许我们把一个表中的某列值转换为输出表中的多个列头,通过聚合函数将其它列的值计算成相应的列值。例如,若有一个销售...
在SQL Server中,有时我们需要处理存储在单个列中的数据,这些数据可能以特定分隔符(如逗号)的形式存在。这样的数据结构虽然在存储时节省空间,但在数据分析和查询时却带来了挑战。本文将深入探讨如何使用SQL ...
在SQL中,Unpivot函数是一种转换数据模式的工具,它能将数据表中的列转换成行。这个功能在处理多值属性或者需要将结构化的数据重新布局时特别有用。在本篇文章中,我们将深入探讨SQL的Unpivot函数,以及如何使用它来...
在SQL Server中,有时我们需要将存储在表格中的列记录转换为行记录,这一操作被称为“行列转换”或“PIVOT”操作。这种转换在处理数据汇总或展示时非常有用,例如将每个学生的各科成绩从多行显示转换为一行显示。在...
标题中的“列变成行存储过程”是指在数据库中,通过特定的编程手段将原本存储为列的数据转换成行的形式展示或处理。这种操作通常在数据处理时非常有用,特别是当需要将多列数据合并成一列,或者进行复杂的报表生成时...
在SQL Server(mssql)中,行转列和列转行是常见的数据处理需求,尤其在数据分析和报表展示时。本文将详细介绍如何在mssql中实现这两种转换。 首先,我们来探讨行转列。行转列通常是将具有多个值的同一列转换为多列...
本文介绍了在SQL Server 2000和SQL Server 2005中进行行列转换的不同方法及其扩展知识点。通过这些方法,我们可以更加灵活地处理数据,特别是在面对不确定的数据结构时。无论是静态SQL还是动态SQL,都有其适用场景。...
本篇将详细介绍如何在SQL Server中拆分表行数据,以适应更高效的数据管理和分析。 首先,我们来看一个常见的场景:假设有一个名为`Employees`的表,其中有一个`Skills`字段,该字段用逗号分隔的字符串存储员工的...
若有多个列,每个列名独立一行,并相对于`SELECT`向右缩进8个空格(C#中的SQL字符串无需缩进)。 - `FROM`子句中的表名或联接条件也应独立一行。 - 使用`WHERE`子句时,条件应逐一列出,每个条件占一行,复杂的...
Excel文件通常以单元格的形式组织数据,每个单元格包含一个值,这些单元格可以组合成行和列,形成工作表。在处理大数据时,Excel的工作表可以看作是轻量级的表格数据库,每个单元格的数据类型可以是文本、数字、日期...
- 索引的选择性对SQL Server执行计划有影响。 34. **查询和索引策略**: - SQL查询避免复杂运算和游标。 - 禁止在索引列上使用函数。 - 不在查询中指定索引。 - 类型匹配以利用索引。 - 控制JOIN数量。 - ...
有时需要将表格中的行转换成列,或将列转换成行,这可以通过简单的操作实现。 **详细内容:** - **使用“转置”功能:** 选中需要转换的数据,复制后,在目标位置粘贴时选择“选择性粘贴”,然后勾选“转置”选项...