Ⅰ 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
*/