当前位置:首页 » 服务存储 » 行转列存储过程
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

行转列存储过程

发布时间: 2022-07-01 09:03:24

Ⅰ 请教一个将行转换成列的问题,用sql语言如何实现,存储过程也行

你的条件要求有点乱,看不大明白了,但是行转列的例子我可以给你看个,可以看着改改就行
if object_id('pubs..tb') is not null
drop table tb
go
create table tb
(
ID int,
VALUE varchar(10)
)

insert into tb(ID,VALUE) values(1,'A')
insert into tb(ID,VALUE) values(2,'B')
insert into tb(ID,VALUE) values(3,'C')
insert into tb(ID,VALUE) values(4,'D')
insert into tb(ID,VALUE) values(5,'E' )

declare @sql varchar(8000)
set @sql = 'select '''
select @sql=@sql+VALUE from (select top 3 VALUE from tb order by newid())tc
select @sql=@sql+''''

exec(@sql)

drop table tb

Ⅱ sql语句行转列 怎么转啊

--声明变量

declare@sqlvarchar(1000),@num_dataint,@num_allvarchar(2000),@num_numint,@table_sqlvarchar(2000)

set@num_num=0

--判断并创建表

ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[records]')andOBJECTPROPERTY(id,N'IsUserTable')=1)

droptable[dbo].[records]

createtablerecords(

[id]int,

[name]varchar(50),

[sex]varchar(10),

[num]int

)

--插入数据

insertintorecordsvalues(1,'tom','男',2)

insertintorecordsvalues(1,'tom','男',3)

insertintorecordsvalues(1,'tom','男',4)

insertintorecordsvalues(1,'tom','男',5)

--全选表中数据

select*fromrecords

--全选num列数据

selectnumas'数据'fromrecords

--释放游标

deallocateselect_num

--为‘selectnumfromrecords’建立游标

declareselect_numscrollcursorforselectnumas'shuju'fromrecords

--打开游标

openselect_num

--获得第一条数据

fetchnextfromselect_numinto@num_data

set@num_all=convert(varchar,@num_data)+','

set@num_num=@num_num+1;

--如果获取成功,继续获得数据

while@@fetch_status=0

begin

fetchnextfromselect_numinto@num_data

set@num_num=@num_num+1;

set@num_all=@num_all+convert(varchar,@num_data)+','

end

--关闭游标

closeselect_num

print@num_num

--set@num_num=@num_num-1;

declare@iint

set@i=1

print@num_num

print@i

set@table_sql='createtablenumall(idint,namevarchar(50),sexvarchar(10)'

print@table_sql

while@num_num>=1

begin

set@table_sql=@table_sql+',num'+convert(varchar,@i)+'int'

set@num_num=@num_num-1;

set@i=@i+1

end

set@table_sql=@table_sql+')'

print@table_sql

ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[numall]')andOBJECTPROPERTY(id,N'IsUserTable')=1)

droptable[dbo].[numall]

exec(@table_sql)

declare@insert_sqlvarchar(2000)

set@insert_sql='insertintonumallvalues(1,'+'''tom'','+'''男'''

print@insert_sql

openselect_num

--获得第一条数据

fetchnextfromselect_numinto@num_data

set@insert_sql=@insert_sql+','+convert(varchar,@num_data)

--如果获取成功,继续获得数据

while@@fetch_status=0

begin

fetchnextfromselect_numinto@num_data

set@insert_sql=@insert_sql+','+convert(varchar,@num_data)

end

set@insert_sql=@insert_sql+')'

print@insert_sql

exec(@insert_sql)

--insertintonumallvalues(1,'tom','男',2,3,4,5,5)

select*fromnumall

试试吧,数据虽然有点出入,但已经说明问题了!!!

Ⅲ sql 动态行转列只能写存储过程吗

如果使用的频率不高,可以不用写成存储过程,定义个临时变量执行下
如果使用频率高还是用存储过程把,sql代码涉及字符串拼接,建议用存储过程封装起来好。

Ⅳ oracle行转列写法,麻烦大家帮忙写个sql,谢谢

可以用wm_concat函数先把数据变成行显示,然后再通过截取来显示具体的月份,wm_concat转换如下

selectcompay_namecn,wm_concat(income)ic

from(selectcompay_name,sum(income)income,substr(time,1,6)time

fromincome

---wheretime>=start_monthandtime<=end_month

groupbycompay_name,substr(time,1,6)

orderbycompay_name,substr(time,1,6))

groupbycompay_name;

数据库SQL实现行转列。请懂的人帮忙,谢谢!

没有环境,试试下面语句可否实现(oracle):
select Customer.CustomerId,
Customer.CustomerName
wm.concat(Phone.PhoneNumber)
from Customer left join
(
select CustomerPhone.CustomerId,
Phone.PhoneNumber
from CustomerPhone inner join Phone on CustomerPhone.PhoneId=Phone.PhoneId
order by CustomerPhone.CustomerId
)Phone on Customer.CustomerId=Phone.CustomerId

Ⅵ 动态表行转列怎么实现,SQL语句或存储过程都可以。求指教。

可以使用动态行列转换,先拼出相关的sql语句的字符串,再用exec 来执行。

Ⅶ SQL2008 存储过程行列转换

ALTERPROC[dbo].[Report_Sale_JXS_HFgongdan]
(@BeginDateDatetime
,@EndDatedatetime
,@Name1VARCHAR(50)
,@Name2VARCHAR(50))
AS
BEGIN
if@EndDate<='2010-01-01'
begin
select@EndDate=GETDATE()
end
SELECT
T0.CARDNAMEAS'客户名称',T0.CARDPHONEAS'客户电话',T0.VINAS'车架号',T0.MNameAS'车型描述'
,T4.OColorNameAS'车身颜色',T0.NoteAS'备注',T0.JYNoteAS'建议',T6.U001AS'事业部',T4.CmpCodeAS'经销商编号'
,T0.SaleNameAS'经销商名称',T0.SalePhoneAS'经销商电话',CONVERT(VARCHAR(10),T0.DocDay,23)AS'来电日期'
--,T3.L1DESCAS'问题'

--,T3.L1AnswerAS'回答'

--,T3.L1ScoreAS'得分'
,MAX(CASEWHENT3.L1DESC='XXX问题'THENT3.L1AnswerEND)AS'XXX问题的回答'
--所有问题按上面那样子写出来
,MAX(CASEWHENT3.L1DESC='XXX问题'THENT3.L1ScoreEND)AS'XXX问题的得分'
--所有问题按上面那样子写出来
,T0.[Status]AS'回访状态',T0.DocTotalAS'综合得分',T0.HFTypeNameAS'回访类型',T2.userNameAS'回访人员'
,casewhenT0.IsHFCG='1'then'是'
whenT0.IsHFCG='0'then'否'endAS'是否成功'
,casewhenT0.IsClose='1'then'是'
whenISNULL(T0.IsClose,0)='0'then'否'endas'是否结束'
FROMdmsSaleHFDJT0
innerJOINdmsSaleHFLXT1ONT0.HFTypeName=T1.[DESC]
innerjoindmsBaseUserT2onT0.HFPsnName=T2.userName
innerjOINdmssaleHFDJ1T3ONT3.ID=T0.ID
INNERjoindmsSaleOCarT4onT4.VIN=T0.VIN
innerjoindmsBaseUserT5onT5.userCode=T4.CmpCode
innerjoindmsBaseChinaT6ONT5.province=T6.Id
whereconvert(varchar(10),T0.DocDay,23)>=@BeginDate
andconvert(varchar(10),T0.DocDay,23)<=@EndDate
and(T0.HFTypeName=@Name1or@Name1='')
and(T0.HFPsnName=@Name2or@Name2='')
----------
GROUPBY'除T3.L1DESC、T3.L1Answer、T3.L1Score所有列'
END

或者直接在报表里面列分组

Ⅷ MySQL数据库动态行转列

这段时间要弄财务报表,遇到了一个动态行转列的问题,数据库用的是mysql的。感觉mysql实现动态行转列比mssql复杂多了。网上的都是处理的一个表(比较简单),而我要处理的数据来自于多个表,对于行转列的行也要进行一定的过滤处理,最后在自己的努力下,总算出来啦,附件是完整代码。这两个存储过程都是带输入参数的,一个对要转的行有处理,一个没有处理,两个例子,都放出来,希望可以给遇到同样问题的朋友一些帮助。

Ⅸ 求SQL存储过程 要求 能行转列

在存储过程中行转列之话,要用游标来实现。
不过下面有一个示例代码,用来行转列的。当然与是否为存储过程无关。
请参考。

If object_id('ta') is not null
Drop table ta
Go
Create table ta(No int,c nvarchar(5),d smalldatetime,j numeric(4,2))
Go
Insert into ta
select 1,'PC001','20080901',12.30 union all
select 2,'PC001','20080902',12.50 union all
select 3,'PC001','20080903',12.10 union all
select 4,'PC001','20080904',15.60 union all
select 5,'PC001','20080905',14.10 union all
select 6,'PC002','20080901',13.20 union all
select 7,'PC002','20080902',12.30 union all
select 8,'PC002','20080903',14.50 union all
select 9,'PC002','20080904',16.20 union all
select 10,'PC002','20080905',14.20
Go
--Start

create table #(pid int identity(1,1), d datetime)
insert #(d) select distinct d from ta
declare @s1 varchar(8000),@s2 varchar(2000)
select @s2=isnull(@s2+',','')+''''+convert(char(10),d,112)+''''
from #
select @s1=isnull(@s1+',','')+'['+ltrim(pid)+']=max(case when convert(char(10),d,120) = '''+convert(char(10),d,120)+''' then cast(j as varchar) else '''' end)'
from #
exec('select * from (select c as no,'+ @s1+ ' from ta group by c union all select ''日期'','+@s2 + ') as t order by case when ascii(no) > 122 then 0 else 1 end ')
drop table #