首页数据库数据库行列转换,SQL语句行列转换方法有哪些

数据库行列转换,SQL语句行列转换方法有哪些

编程之家2023-10-1881次浏览

大家好,关于数据库行列转换很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于SQL语句行列转换方法有哪些的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

数据库行列转换,SQL语句行列转换方法有哪些

SQL数据横列变竖列

以下方法适用于任意多的科目:

--先建立函数,功能是根据给出的姓名,到表中去查找所选科目及成绩并横向列示出来.

CREATE FUNCTION getcoldata

(@XM VARCHAR(18))

RETURNS varchar(1000)

AS

数据库行列转换,SQL语句行列转换方法有哪些

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选修科目

数据库行列转换,SQL语句行列转换方法有哪些

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语句行列转换方法有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

数据库储存过程(数据库储存过程有哪些种类)收购域名 怎样卖出域名