㈠ 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代碼涉及字元串拼接,建議用存儲過程封裝起來好。