数据库行列转换,SQL语句行列转换方法有哪些
大家好,关于数据库行列转换很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于SQL语句行列转换方法有哪些的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
SQL数据横列变竖列
以下方法适用于任意多的科目:
--先建立函数,功能是根据给出的姓名,到表中去查找所选科目及成绩并横向列示出来.
CREATE FUNCTION getcoldata
(@XM VARCHAR(18))
RETURNS varchar(1000)
AS
BEGIN
DECLARE@deli VARCHAR(2)
set@deli=''
declare@f1 varchar(100),@F2 DECIMAL(12,1),@result varchar(1000),@sn0 int
set@result=''
declare ddcursor cursor for select选修科目,成绩 from表名 where姓名=@XM order by选修科目
open ddcursor
fetch next from ddcursor into@f1,@F2
while@@fetch_status!=-1
begin
set@result=@result+@deli+isnull(@f1,'')+':'+ISNULL(CONVERT(VARCHAR,@F2),'')
fetch next from ddcursor into@f1,@F2
end
close ddcursor
deallocate ddcursor
return(@result)
end
GO
--使用方法:
select姓名,科目及成绩=dbo.getcoldata(姓名) from(SELECT DISTINCT姓名 from表名) a
结果是这样的
姓名科目与成绩
张三计算机:75高等数学:80物理:77
李四高等数学:55微积分:87
王五语文:78
=============
我这么看您的问题:
1.查询是用来输出的,不是用来统计的:您的这种结果即使用分开字段也是很不容易统计的,要想统计还是原表比较方便.
就是说:这种查询结果更方便输出\查看,原表更方便于作统计.
所以,我劝您,比较科学的作法是保留原表,可以方便的作出包括本查询在内的各种查询.而您如果只保留查询后的表,即使用字段是分开的,那么将很难再作其它统计和查询.因为数据太不规范.
2.可以输出各门分开的EXCEL表:如果您想输出到EXCEL表,您要以把函数中的分隔符改成逗点或制表符(CHAR(9)),直接存成CSV或XLS文档就成了.
3.完全按照您的结果也能输出.但今天我没空了,给你个提示:
先看看我以前的回答中,有一些是关于加序号的,加上序号后就好说了.
===========
加到200分,我就开始为您作分开字段的查询.(办法我知道,但是很麻烦啊)
===============================================
与您的要求完全相同的查询:
为了清楚,先建立一个查询,给每人的科目加序号,如果不理解,执行一下SELECT* FROM MYVIEWNAME就知道了:
=====================
视图改一下:
create view myviewname
as
select姓名,科目,成绩,序号=(select count(1) from tablename a where a.姓名=b.姓名 and a.科目>=b.科目) from
(select* from tablename where状态='有效')--以子查询替换了TABLENAME,够直观吧?
b--视图加上了序号字段
go
然后,这就是您要的查询,根据每人所选科目的最大数,可以无限向后延伸,加入科目6,科目7等:
select a.姓名,
科目1=isnull(t1.科目,''),
成绩1=isnull(t1.成绩,''),
科目2=isnull(t2.科目,''),
成绩2=isnull(t2.成绩,''),
科目3=isnull(t3.科目,''),
成绩3=isnull(t3.成绩,''),
科目4=isnull(t4.科目,''),
成绩4=isnull(t4.成绩,''),
科目5=isnull(t5.科目,''),
成绩5=isnull(t5.成绩,'')
from(SELECT DISTINCT姓名 from tablename) a
left join myviewname t1 on t1.姓名=a.姓名 and t1.序号=1
left join myviewname t2 on t2.姓名=a.姓名 and t2.序号=2
left join myviewname t3 on t3.姓名=a.姓名 and t3.序号=3
left join myviewname t4 on t4.姓名=a.姓名 and t4.序号=4
left join myviewname t5 on t5.姓名=a.姓名 and t5.序号=5
好了,加到200分再选择正确答案!
SQL语句行列转换方法有哪些
SQL语句行列转换的两种方法 case...when和pivot函数应用,运用pivot函数只支持数据库版本2005以上的。一般运用case when else end的方法比较多,比较普遍/*创建数据库*/ CREATE DATABASE tmp go USE tmp go/*创建数据库测试表*/ CREATE TABLE [Scores](
SQL语句行列转换的两种方法 case...when和pivot函数应用,运用pivot函数只支持数据库版本2005以上的。一般运用case when else end的方法比较多,,比较普遍
/*创建数据库*/
CREATE DATABASE tmp
go
USE tmp
go
/*创建数据库测试表*/
CREATE TABLE [Scores]
(
[ID] INT IDENTITY(1, 1)
PRIMARY KEY,
[Student] VARCHAR(20),
[Subject] VARCHAR(30),
[Score] FLOAT
)
go
TRUNCATE TABLE Scores
/*插入数据库测试数据信息*/
INSERT INTO Scores
( Student, Subject, Score)
VALUES('test001','语文','90')
INSERT INTO Scores
( Student, Subject, Score)
VALUES('test001','英语','85')
INSERT INTO Scores
( Student, Subject, Score)
VALUES('text002','语文','90')
INSERT INTO Scores
( Student, Subject, Score)
VALUES('text002','英语','80')
INSERT INTO Scores
( Student, Subject, Score)
VALUES('test003','语文','95')
INSERT INTO Scores
( Student, Subject, Score)
VALUES('test003','英语','85')
/*1. case when.......then else....end用法,行列转换*/
SELECT Student AS'姓名',
MAX(CASE Subject
WHEN'语文' THEN Score
ELSE 0
END) AS'语文',--如果这个行是“语文”,就选此行作为列
MAX(CASE Subject
WHEN'英语' THEN Score
ELSE 0
END) AS'英语'
FROM Scores
GROUP BY Student
ORDER BY Student
/*2. pivot(聚合函数(要转成列值的列名)
for要转换的列
in(目标列名)
)*/
SELECT Student AS'姓名',
AVG(语文) AS'语文',
AVG(英语) AS'英语'
FROM Scores PIVOT( AVG(Score) FOR Subject IN(语文,英语))as NewScores
GROUP BY Student
ORDER BY Student ASC
ORACLE行列转换-拼成字符串
前段时间使用ORACLE同事提出一个需求要求将有相同CODE的值连接成一个字符串这种小问题怎会难倒我于是提出方案!
Sql代码
建表语句
create table SP_ALERT_PA_GROUP
(
ID INTEGER not null
ALERTCODE VARCHAR()
PAINNERCODE VARCHAR()
)
insert into sp_alert_pa_group(ID ALERTCODE PAINNERCODE)
values( AL R);
insert into sp_alert_pa_group(ID ALERTCODE PAINNERCODE)
values( AL R);
insert into sp_alert_pa_group(ID ALERTCODE PAINNERCODE)
values( AL R);
insert into sp_alert_pa_group(ID ALERTCODE PAINNERCODE)
values( AL R);
要求显示的结果
ALERTCODE PAINNERCODE
AL R R
AL R R
使用自定义函数
Sql代码
CREATE OR REPLACE FUNCTION getpa(alertcode VARCHAR)
RETURN VARCHAR
IS
pastr VARCHAR();
BEGIN
FOR cur IN(SELECT painnercode FROM sp_alert_pa_group WHERE alertcode=alertcode) LOOP
pastr:= pastr||cur painnercode||;
END LOOP;
RETURN pastr;
END;
然后使用下面的SQL查询即可!
SELECT DISTINCT alertcode getpa(alertcode) FROM sp_alert_pa_group f
使用ORACLE内置函数实现只支持 G以上
Sql代码
SELECT wmsys wm_concat(painnercode) FROM sp_alert_pa_group
这个简单明了但是我这里不能用哎数据库版本的问题太低
使用SQL语句迭代(sys_connect_by_path)
Sql代码
select substr(max(sys_connect_by_path(painnercode))) paramcode
from(select a* row_number()over(order by painnercode) rn from sp_alert_pa_group a)
start with rn=
lishixinzhi/Article/program/Oracle/201311/16949关于数据库行列转换和SQL语句行列转换方法有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。