⑴ sql Server 竖向结果转换为横向
SELECT 姓名
,'数学'=MAX(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END)
,'语文'=MAX(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END)
,'英语'=MAX(CASE 课程 WHEN '英语' THEN 分数 ELSE 0 END)
FROM TB
GROUP BY 姓名
--或者
SELECT 姓名,
,'数学'=SUM(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END)
,'语文'=SUM(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END)
,'英语'=SUM(CASE 课程 WHEN '英语' THEN 分数 ELSE 0 END)
FROM TB
GROUP BY 姓名
⑵ SQL里面如何将竖着的列横着显示
一般这样的情况
如果是我做的话
就预先建立一个表
设置time1
time1
time3……
然后
分别逐次以
no
和日期为
time
分组
;行标题
time
为列标题
和
值(求和)……对先前建立的表进行追加……
SQL
我不太熟悉
在access
中
完全可以做的……
还有
如果
你能够
把你的时间
划分成不同的时间段
而对应到固定的时间段中的话,完全
直接可以使用
一个交叉查询就可以了……
但愿
这个提示
对你有所帮助……
⑶ sql 里面怎么把竖表变成横表
select 姓名,sum(case when 科目='数学' then 分数 end) as 数学,sum(case when 科目='语文' then 分数 end) as 语文,sum(case when 科目='英语' then 分数 end) as 英语 from 表名
group by 姓名
⑷ SQL 竖列 转换横列的问题
使用CASE来处理。
select 编号, sum( 第一季度第一次施肥量) 第一季度第一次施肥量, sum( 第一季度第二次施肥量) 第一季度第二次施肥量, sum( 第二季度第一次施肥量) 第二季度第一次施肥量
from
(
select 编号
case when 季度=1 and 施肥次数=1 then 施肥量 else null end 第一季度第一次施肥量,
case when 季度=1 and 施肥次数=2 then 施肥量 else null end 第一季度第二次施肥量,
case when 季度=2 and 施肥次数=1 then 施肥量 else null end 第二季度第一次施肥量
from 表
) a
group by a.编号
⑸ sql中把查询结果从竖列转为横向
select a as A,max(case when b='a' then c end) as a,max(case when b='b' then c end) as b,max(case when b='c' then c end) as c,max(case when b='d' then c end) as d from a
⑹ oracle中sql语句中的分组,如何将竖列变横列
create or replace type list_agg as object
(
total varchar2(4000),
static function ODCIAggregateInitialize(sctx IN OUT list_agg)
return number,
member function ODCIAggregateIterate(self IN OUT list_agg,
value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN list_agg,
returnValue OUT varchar2,
flags IN number)
return number,
member function ODCIAggregateMerge(self IN OUT list_agg,
ctx2 IN list_agg) return number
);
create or replace type body list_agg is
static function ODCIAggregateInitialize(sctx IN OUT list_agg) return number is
begin
sctx := list_agg(null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT list_agg,
value IN varchar2) return number is
begin
self.total := self.total || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN list_agg,
returnValue OUT varchar2,
flags IN number) return number is
begin
returnValue := substr(self.total, 2);
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT list_agg,
ctx2 IN list_agg) return number is
begin
self.total := self.total || ctx2.total;
return ODCIConst.Success;
end;
end;
CREATE OR REPLACE FUNCTION ColumnToRow(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING list_agg;
select ColumnToRow(','||Tname) from tab where rownum<10;
⑺ 如何通过sql将表中竖向数据转换成横向数据
行列转换等经典SQL语句
参考资料:http://blog.csdn.net/kiki113/archive/2009/04/24/4105929.aspx
1.--行列转换
原表: 姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 物理 82
李四 英语 90
李四 政治 70
王五 英语 90
转换后的表: 姓名 数学 物理 英语 语文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
张三 90 85 0 80 0
实例:
create table cj --创建表cj
(
ID Int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定义ID为表cj的主键
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '张三','语文',80 union all
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90
--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列转换--合并
原表: 班级 学号
1 1
1 2
1 3
2 1
2 2
3 1
转换后的表: 班级 学号
1 1,2,3
2 1,2
3 1
实例:
Create table ClassNo --创建表ClassNo
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Class Varchar(50), --班级列
Number Varchar(50), --学号列
Primary Key(ID) --定义ID为表ClassNo的主键
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
创建一个合并的函数
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
--调用自定义函数得到结果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列转行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定义ID为表ColumnToRow的主键
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的长度就是这个字符串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因为它会把ID这一列的值也算进去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')
⑻ sql里边怎么竖列变横列,
这个最好在一个存储过程中完成。因为每个“分组值”的多少不同。比如PF66152210L有两个,有些就有三个,谁知道最多有多少个,以前写过一个,是用过程完成的。
加特征码
用row_number() over 并将这个字段命名为rows
按照f1分组,然后,这样能在后面加上1,2,3,.....,不用排序,分组就行
利用case when
在刚才那个查询结果的外面包一层,利用(case when rows=1 then f2 end)h2,(case when rows=2 then f2 end)h3,....... group by f1
你试试吧,应该可以。
如果,f2在一行里边,中间用,隔开也可以
那么就用 wmsys.wm_concat就行了。(不过我说的是oracle库啊)
⑼ SQL 语句问题 纵列如何转化成横列
例子如下:
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
Insert tb
Select '张三','语文',60 union all
Select '张三','数学',70 union all
Select '张三','英语',80 union all
Select '张三','物理',90 union all
Select '李四','语文',65 union all
Select '李四','数学',75 union all
Select '李四','英语',85 union all
Select '李四','物理',95
go
declare @sql varchar(8000)
set @sql = ''
select @sql = @sql+[课程]+'=sum(case when [课程]='''+[课程]+''' then [分数] else 0 end),' from (SELECT DISTINCT [课程] FROM TB) A
--print @sql
set @sql = left(@sql,len(@sql) - 1)
set @sql = 'select [姓名]=max([姓名]), '+@sql+' from tb group by [姓名] '
print @sql
exec (@sql)
--drop table t
select [姓名]=max([姓名]),
数学=sum(case when [课程]='数学' then [分数] else 0 end),
物理=sum(case when [课程]='物理' then [分数] else 0 end),
英语=sum(case when [课程]='英语' then [分数] else 0 end),
语文=sum(case when [课程]='语文' then [分数] else 0 end)
from tb group by [姓名]
结果:
李四 75 95 85 65
张三 70 90 80 60
⑽ SQL 如何查询时 竖着的数据 横着显示
你这个是将纵表转换为横表,例如如下数据:
'wangming', 'shuxue', 100
'wangming', 'yuwen', 90
'wangming', 'yingyu', 140
可以使用如下语句处理:
select a.v_name,a.v_score shuxue,b.v_score yuwen,c.v_score yingyu from temp_1 a,temp_1 b,temp_1 c
where a.v_name=b.v_name
and a.v_name=c.v_name
and a.v_name='wangming'
and a.v_course='shuxue'
and b.v_course='yuwen'
and c.v_course='yingyu';