當前位置:首頁 » 編程語言 » sql列轉行動態
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql列轉行動態

發布時間: 2022-02-23 12:33:56

sql 列轉行

http://www.itpub.net/thread-1017026-1-1.html# oracle行列轉化

Ⅱ 急求 sql 動態行變列

CREATETABLETestRowCol(
nameVARCHAR(10),
placeVARCHAR(10),
valuwINT
);


INSERTINTOTestRowColVALUES('張三','東',1);
INSERTINTOTestRowColVALUES('張三','南',2);
INSERTINTOTestRowColVALUES('張三','西',3);
INSERTINTOTestRowColVALUES('張三','北',4);
INSERTINTOTestRowColVALUES('李四','東',5);
INSERTINTOTestRowColVALUES('李四','南',6);
INSERTINTOTestRowColVALUES('李四','西',7);
INSERTINTOTestRowColVALUES('李四','北',8);


注:下面的SQL是在SQLServer2005及以上版本可用。(SQLServer2000及以下版本的,下面的寫法不支持)

使用CASEWHEN方式的動態處理.
BEGIN
--主SQL.
DECLARE@MainSqlvarchar(2000);
--產生動態列的SQL.
DECLARE@ColumnSqlvarchar(1000);
--設置產生動態列的SQL.
SET@ColumnSql=
(
SELECT
',SUM(CASEWHENplace='''+place+'''THENvaluwELSE0END)AS'+place
FROM
TestRowCol
GROUPBY
place
FORXMLPATH('')
);
--設置主SQL.
SET@MainSql=
'SELECTname'+@ColumnSql+'FROMTestRowColGROUPBYname';
--執行主SQL.
EXECUTE(@MainSql);
END
GO
name北東南西
------------------------------------------------------
李四8567
張三4123


使用PIVOT方式的動態處理.
BEGIN
--主SQL.
DECLARE@MainSqlvarchar(2000);
--產生動態列的SQL.
DECLARE@ColumnSqlvarchar(1000);
--設置產生動態列的SQL.
SET@ColumnSql=
STUFF(
(
SELECT
','+place
FROM
TestRowCol
GROUPBY
place
FORXMLPATH('')
),1,1,'');
--設置主SQL.
SET@MainSql=
'SELECT*FROMTestRowCol'
+'PIVOT(SUM(valuw)FORplaceIN('
+@ColumnSql
+'))tmpORDERBYname';
--執行主SQL.
EXECUTE(@MainSql);
END
GO

name北東南西
------------------------------------------------------
李四8567
張三4123
(2行受影響)

Ⅲ sql server 列轉行

SQL Server 2005之後支持pivot關鍵字。
select year,[1],[2],[3],[4]
from 表A
pivot(max(num) for [month] in ([1],[2],[3],[4])) as pvt

SQL Server 2000以及之前版本,可以參考imlees的方法。

Ⅳ sql動態實現行列轉換

題:假設有張學生成績表(tb)如下:
姓名 課程 分數
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
想變成(得到如下結果):
姓名 語文 數學 物理
---- ---- ---- ----
李四 74 84 94
張三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int)
insert into tb values('張三' , '語文' , 74)
insert into tb values('張三' , '數學' , 83)
insert into tb values('張三' , '物理' , 93)
insert into tb values('李四' , '語文' , 74)
insert into tb values('李四' , '數學' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 靜態SQL,指課程只有語文、數學、物理這三門課程。(以下同)
select 姓名 as 姓名 ,
max(case 課程 when '語文' then 分數 else 0 end) 語文,
max(case 課程 when '數學' then 分數 else 0 end) 數學,
max(case 課程 when '物理' then 分數 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 動態SQL,指課程不止語文、數學、物理這三門課程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

Ⅳ 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 動態行列轉換語句解釋,要求對每一條語句進行解釋,主要是看不懂動態的列是怎麼循環出來的

其實這個是組合的一條sql語句,
declare @sql varchar(8000) --聲明一個變數
set @sql = 'select 姓名' --為這個變數賦值
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
--更加課程這個欄位來給分數排序(case 。。。。 then ..。。。表示當課程這個欄位位某個值的時候給這個分數賦值,否則該課程分數為0) max()函數表示給根據課程的字母來排序
(select distinct 課程 from tb) as a--表示查詢tb的表中不重復的課程 然後把結果轉換為a

set @sql = @sql + ' from tb group by 姓名' --根據姓名來做排序
exec(@sql) --執行組合的sql語句

Ⅶ Sql動態列轉行,該怎麼解決

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

Ⅷ sql列轉行

為何硬是要到資料庫里變換呢?程序後台代碼不是很好操作么?

Ⅸ 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語句 列變行 行變列

--SQL Server 2005以上版本用unpivot
use Tempdb
go
--> -->

if not object_id(N'Tempdb..#1') is null
drop table #1
Go
Create table #1([區域名稱] nvarchar(3),[小類1] int,[小類2] int,[小類3] int)
Insert #1
select N'奎文區',120,100,90
Go
select
[區域名稱],[分類],[值]
from
#1
unpivot
([值] for [分類] in([小類1],[小類2],[小類3]))b
/*
區域名稱 分類 值
奎文區 小類1 120
奎文區 小類2 100
奎文區 小類3 90
*/