当前位置:首页 » 编程语言 » sql动态列转行
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql动态列转行

发布时间: 2022-02-26 22:12:50

sql动态列转行,该怎么解决

SELECT INDEXDEF , REGEXP_SUBSTR(GRADECODE , '[^,]+', 1, LEVEL, 'i') GRADECODE FROM tt CONNECT BY LEVEL

㈡ sqlserver如何列转行

CREATETABLE#test(
snINT,
enINT
);

INSERTINTO#testVALUES(1,5);
INSERTINTO#testVALUES(6,7);
INSERTINTO#testVALUES(8,8);
INSERTINTO#testVALUES(9,12);
go


SELECTDISTINCT
m.number
FROM
#testt
JOINmaster..spt_valuesm
ON(
t.sn<=m.number
ANDt.en>=m.number
);
go


查询结果:

number
-----------
1
2
3
4
5
6
7
8
9
10
11
12

(12行受影响)

㈢ sql列转行,如何把表转化为这个结果一共一行 一列.如何实现.

通用的办法是用动态sql解决:

declare@sqlvarchar(2000);
set@sql='select''';
select@sql=@sql+列名+','from表名;
select@sql=left(@sql,len(@sql)-1)+''''
exec(@sql);

此外,SQL Server2005以上版本可以用XML Path解决。

SELECT列名+','FROM表名FORXMLPATH('')

这样将直接得到'a,b,c,d,d,e,',需要进一步处理去掉最后的逗号

㈣ sqlserver列转行 查询

select*fromA_14072201

IDUSERID
4685938130
46859888
4681138130
4681137761
4647037836
4647037836
4643037836
4643037836
selectID,USERIDfromA_14072201
whereIDin(selectIDfrom(selectID,USERIDfromA_14072201groupbyID,USERID)astableAgroupbyIDhavingCOUNT(*)=2)

IDUSERID
4685938130
46859888
4681138130
4681137761
selecttable1.ID,table1.USERID,table2.USERID
from(selectID,USERIDfrom(selectID,USERID,ROW_NUMBER()over(orderbyID)ROWNUMBERfromA_14072201whereIDin(selectIDfrom(selectID,USERIDfromA_14072201groupbyID,USERID)astableAgroupbyIDhavingCOUNT(*)=2))astableBwhereROWNUMBER%2=1)table1
innerjoin
(selectID,USERIDfromA_14072201whereIDin(selectIDfrom(selectID,USERIDfromA_14072201groupbyID,USERID)astableAgroupbyIDhavingCOUNT(*)=2))table2
ontable1.ID=table2.IDandtable1.USERID<>table2.USERID

IDUSERIDUSERID
468113813037761
4685938130888
--结果是对的,写的有点乱,你捋一捋然后优化一下,优化不了就直接改成表值函数去处理,我工作去了,话说你这个问题是半夜2:39发的,要注意身体啊。

㈤ SQLSERVER 列转行

第一:你的时间维度表基本没有意义,微软SSIS中心认为时间维度至少由日期构成主键。可以认为是最小基本业务颗粒。

来个Sample,更复杂的在我空间里。但是道理是一样的。都是借助动态SQL和一些函数。

----------------------------------------------------------------
/*
作者:Edwin
数据库:SQLSERVER2005+
作用:指定时间区间的自然周有几天,如果垮年度,由外围验证
Version1.0
Copyright(c)2015,SQLSERVER2008
*/
----------------------------------------------------------------
/*参数设定区域,参数为开始时间和结束时间*/
----------------------------------------------------------------
declare@FDateDateTimeset@FDate='2014-09-0100:00:00.000'
declare@EdateDateTimeset@Edate='2015-01-0100:00:00.000'
----------------------------------------------------------------
/*SQL主体*/
----------------------------------------------------------------
declare@WeekHeadernvarchar(max)
select@WeekHeader=coalesce(@WeekHeader+',['+cast(WeekOfYearasvarchar)+']','['+cast(WeekOfYearasvarchar)+']')
from
(
selectWeekOfYearfromComn.CalendarwhereDatePerDay>=@FDateandDatePerDay<@EdategroupbyWeekOfYear
)M
declare@PivotSQLnvarchar(max)set@PivotSQL=N'
select
Yearas年份,'+@WeekHeader+'
from
(
select[Year],WeekOfYear,DatePerDayfrom[DT_WareHouse].[Comn].[Calendar]whereDatePerDay>=@FDateandDatePerDay<@Edate
)M
pivot
(
count(DatePerDay)for[WeekOfYear]in('+@WeekHeader+')
)PVT'
execsp_executesql@PivotSQL,N'@FDatedatetime,@Edatedatetime',@FDate,@Edate

执行结果:

㈥ sql动态多行转列,PIVOT怎么能转两列

楼上那个用过sqlserver吗?

PIVOT是支持的!!!!!

不过看你的语法,肯定报错。PIVOT最好基于SELECT * 并且先把全部需求的字段转换未列:

select * from

(select CONVERT(varchar(100),年月)+'受理' 栏位,sum(受理数量) 数量 from

表a

GROUP BY 年月

UNION ALL

select CONVERT(varchar(100),年月)+'办结'栏位,sum(办结数量) 数量 from

表a

GROUP BY 年月)v

PIVOT ( MAX(v.数量) FOR v.栏位 IN ( [2019-01受理],

[2019-02受理],

[2019-03受理],

[2019-04受理],

[2019-01办结],

[2019-02办结],

[2019-03办结],

[2019-04办结] )) 网络知道回答用

㈦ sql语句列转行

我整理的行转列的问题:

--创建tb表
createtabletb(姓名varchar(10),课程varchar(10),分数int)
insertintotbvalues('张三','语文',74)
insertintotbvalues('张三','数学',83)
insertintotbvalues('张三','物理',93)
insertintotbvalues('李四','语文',74)
insertintotbvalues('李四','数学',84)
insertintotbvalues('李四','物理',94)
go

select*Fromtb

--SQLSERVER2000静态行转列
select姓名as姓名,
max(case课程when'语文'then分数elsenullend)语文,
max(case课程when'数学'then分数elsenullend)数学,
max(case课程when'物理'then分数elsenullend)物理
fromtb
groupby姓名

--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare@sqlvarchar(8000)
set@sql='select姓名'
select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'
from(selectdistinct课程fromtb)asa
set@sql=@sql+'fromtbgroupby姓名'
exec(@sql)

--SQLSERVER2005静态SQL。
select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b

--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+'],[','')+课程fromtbgroupby课程
set@sql='['+@sql+']'
exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')

希望对你的学习有帮助。

㈧ sql 2000 结合两张表“动态”实现 行转列

第一步,sql拼接:

select'sum(casewhenarea='''||area||'''then1else0end)'asrows
fromtable

然后取得上面结果的记录集,组合拼接 进行第二步,示例如下:

selectbDate,sum(casewhenarea='保养一区'then1else0end)as保养一区,
sum(casewhenarea='保养二区'then1else0end)as保养二区,
sum(casewhenarea='保养三区'then1else0end)as保养三区,
sum(casewhenarea='保养四区'then1else0end)as保养四区,
sum(casewhenarea='保养五区'then1else0end)as保养五区

fromtable
groupbybDate

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

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