1. sql行列转换
1> create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
2> Insert tb
3> Select '张三','语文',60 union all
4> Select '张三','数学',70 union all
5> Select '张三','英语',80 union all
6> Select '张三','物理',90 union all
7> Select '李四','语文',65 union all
8> Select '李四','数学',75 union all
9> Select '李四','英语',85 union all
10> Select '李四','物理',95
11> go
(8 行受影响)
1>
2> SELECT
3> *
4> FROM
5> tb
6> PIVOT(
7> SUM([分数])
8> FOR [课程] IN ([语文],[数学] )
9> ) tmp
10> go
姓名 语文 数学
---------- ----------- -----------
李四 65 75
张三 60 70
(2 行受影响)
好像没有办法,课程名字必须写在 SQL 里面。
FOR [课程] IN ([语文],[数学] )
2. sql server 2005中,如何将行列转换
create table test1(星期 varchar(10),日期 datetime,一班 varchar(10),二班 varchar(10))
insert into test1
select '星期二', '2012-5-1 0:00','张,王',' 李,赵 '
union all
select ' 星期三','2012-5-2 0:00','李,赵','张,王 '
union all
select ' 星期四 ','2012-5-3 0:00','张,王','李,赵' union all
select '星期五','2012-5-4 0:00','李,赵','张,王' union all
select '星期六','2012-5-5 0:00','张,王','李,赵' union all
select '星期日','2012-5-6 0:00','李,赵','张,王' union all
select '星期一','2012-5-7 0:00','张,王','李,赵' union all
select '星期二','2012-5-8 0:00','李,赵','张,王' union all
select '星期三','2012-5-9 0:00','ddd','李,赵'
因为sqlserver pivot 函数转换的时候 都是转换一列,你这个要转3个列,因为也要把日期给转上去。 所以 就先 把你的源表分开。分成 临时表1( 日期,星期,一班)、临时表2(日期,星期,二班)。等两个都转换好了之后 再union 。 下班是我转的 第一。只把一班的转过来了。二班的 类似就行了,到时候一班二班union的时候 按照日期排序,所以都先保留了日期。。 比较复杂,暂时没有想到好的办法。。。。。。
select *,ROW_NUMBER() over(order by 日期 asc) row,case when 星期一 is not null then 日期 end 星期一1,
case when 星期二 is not null then 日期 end 星期二1,
case when 星期三 is not null then 日期 end 星期三1,
case when 星期四 is not null then 日期 end 星期四1,
case when 星期五 is not null then 日期 end 星期五1,
case when 星期六 is not null then 日期 end 星期六1,
case when 星期日 is not null then 日期 end 星期日1
into #a
from (
select * from (
select 星期,日期,一班 from test1
) a
pivot (
max(一班)
for 星期 in (星期一,星期二,星期三,星期四,星期五,星期六,星期日)
)pvt
) a
select * from (
select row,日期,星期一,星期二,星期三,星期四,星期五,星期六,星期日 from #a
union all
select ROW,日期,convert(varchar(10),星期一1,120 ),convert(varchar(10),星期二1,120 ),convert(varchar(10),星期三1,120 ),convert(varchar(10),星期四1,120 ),convert(varchar(10),星期五1,120 ),convert(varchar(10),星期六1,120 ),convert(varchar(10),星期日1,120 ) from #a
)a order by 1
3. 在excel中用sql语句实现行列转置
在excel中,使用SQL太麻烦了。
有专门的功能,叫透视表,可以试一下。
4. Sql怎么实现行列转换
很遗憾 行列之间不是那么随便说转换就转换的
行 描述的是一个对象 列 只是对象的一个属性
java里说的是
万物皆对象
只要是对象 就可以吧特征抽象成一个类
这就对应于数据库的表
肤浅的说
表就相当于一个类
比如人这一类 有手属性,脚属性,头属性....就不多列举了
他们构成了一个人 (人类表的一行) 而N多拥有相同特征的人 就组成了人类 (人类这个表)
楼主你现在要做的事情无异于要把人给肢解 要把每一个人的手或脚或其他单一部件代替某一个人的全部部件(当做属性)
说简单一点就是 楼主你要的效果就是让人类表的美一个人都不同 而且不同的方式还很奇怪 一个人只有手 一个又只有脚 一直有只有头.....最后整的相同特征全无
这完全不符合归为一类 化为一个表的初衷嘛
不说能不能化行为列
就算可以换行成列 那又有什么意思呢?
完全没有意义嘛
而且在实际开发中也不会有化行成列的需求
5. sql 行列转置
看看这个吧
SQLServer中(行列转换)行转列及列转行且加平均值及汇总值
6. sql中行列转换的代码怎么写
主要应用case语句来解决行转列的问题
行转列问题主要分为两类
1)简单的行转列问题:
示例表:
id sid course result
1 2005001 语文 80.0
2 2005001 数学 90.0
3 2005001 英语 80.0
4 2005002 语文 56.0
5 2005002 数学 69.0
6 2005002 英语 89.0
执行
select sid,语文=isnull(sum(case course when '语文' then result end),0),
数学=isnull(sum(case course when '数学' then result end),0),
英语=isnull(sum(case course when '英语' then result end),0)
from result
group by sid
order by sid
得出结果
sid 语文 数学 英语
2005001 80.0 90.0 80.0
2005002 56.0 69.0 89.0
2)较为复杂的行转列
表1:course
id name
1 语文
2 数学
3 英语
表2:result
id sid course result
1 2005001 语文 80.0
2 2005001 数学 90.0
3 2005001 英语 80.0
4 2005002 语文 56.0
5 2005002 数学 69.0
6 2005002 英语 89.0
declare @sql varchar(8000)
set @sql='select sid'
select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then result end),0)'
from course order by id
set @sql=@sql+' from result group by sid order by sid'
print @sql
exec(@sql)
得出结果
sid 语文 数学 英语
2005001 80.0 90.0 80.0
2005002 56.0 69.0 89.0
7. sql 行列转换
我来说一下:
这个可以写成一句普通的sql,你这写的是动态sql,性能不如普通sql,并且字段名“语文”、“数学”、“物理”,你还无法加上。
一句sql:select 姓名,‘语文’=sum(case 课程 when ‘语文’ then 分数 esle 0 end),‘数学’=sum(case 课程 when ‘数学’ then esle 0 分数 end),‘物理’=sum(case 课程 when ‘物理’ then esle 0 分数 end)from tb group by 姓名
这个其实和他们的差不多,你把这个理想了,你会觉得很简单的,动态sql写的挺复杂的,老实说,我都看不懂,我也懒得看。不理解的问我。
你记住这样一句话:一列数据变成多列数据,用case语句;
一行数据变成多行数据,考虑自连接。
8. SQL里行列转换
sqlserver2005中可以用
Pivot UnPivot
来实现。
sqlserver2000的话,行数 和列数在数据库中是可变的,恐怕很难实现。想想存储过程+临时表吧。
9. SQL数据库中表行列转换显示
只有新创建一张表。CREATE TABLE t_row_col AS
SELECT id, 'c1' cn, c1 cv
FROM t_col_row
UNION ALL
SELECT id, 'c2' cn, c2 cv
FROM t_col_row
UNION ALL
SELECT id, 'c3' cn, c3 cv FROM t_col_row;
SELECT * FROM t_row_col ORDER BY 1,2;
10. oracle sql 中 如何实现table的行列转换
你所谓的行列转换应该是指纵表转横表,横表转纵表.
给你个例子
纵表转横表:
使用DECODE语句,可以很方便的将纵表转为横表,例子如下:
原表查询结果:
ID MAJOR CURRENT_CREDITS
------ ---------------- ---------------
10000 Computer Science 98
10000 History 88
10001 Computer Science 75
10000 Economics 66
我们要把各科成绩从同一列转到不同的列中去。
SQL>?select id,
sum(decode(major,’Computer Science’,current_credits,0)) cs,
sum(decode(major,’History’,current_credits,0)) his,
sum(decode(major,’Economics’,current_credits,0)) eco
from students
group by id
ID CS HIS ECO
------ ----------- ------------- -----
10000 98 88 66
10001 75
横表转纵表:
使用 UNION 即可实现将横表转为纵表,以上面的表为例:
转换前:
ID CS HIS ECO
------ ----------- ------------- -----
10000 98 88 66
SQL>?select id, ’Computer Science’ major,cs current_credits
from students
union
select id, ’History’ major,his current_credits
from students
union
select id, ’Economics’ major,eco current_credits
from students
ID MAJOR CURRENT_CREDITS
------ ---------------- ---------------
10000 Computer Science 98
10000 History 88
10000 Economics 66