㈠ sql怎樣將行的值變為列,,,,
方法/步驟
首先我們建立一張表,名為RToC,各個欄位的設計如下圖,分別是name,course,score,表示姓名,成績與分數,如圖所示。
通過以上幾個步驟,我們就可以輕松的實現行列轉換了。同樣,我們如果要把列轉換成行, 應該怎麼做呢?同樣我們可以採用unpivot函數輕松實現。
㈡ 怎麼用SQL語句將表中的行轉換成列
select岩罩局kldm,
sum(case悶慶whenshy=520100thencnt_kldmelse0end)[520100],
sum(casewhenshy=520101粗讓thencnt_kldmelse0end)[520101]
from表名
groupbykldm
㈢ SQL行列轉換(sql行列轉換最簡單的方法)
很遺憾賀陸行列之間不是那麼隨便說轉換就轉換的
行描述的是一個對象列只是對象的一個屬性禪悔頃
java里說的是
萬物皆對象
只要是對象就可以吧特徵抽象成一個類
這就對應於資料庫的表
膚淺的說
表就相當於一個類
比如人這一類有手屬性,腳屬性,頭屬性....就不多列舉了
他們構成了一個人(人類表的一行)而N多擁有相同特徵的人就組成了人類(人類這個表)
樓主你現在要做的事情無異於要把人給肢解要把每一個人的手或腳或其他單一部件代替某一個人的全部部件(當做屬性)
說簡單一點就是樓主你要的效果就是讓人類表的美一個人都不同而且不同的方式還很奇怪一個前敏人只有手一個又只有腳一直有隻有頭.....最後整的相同特徵全無
這完全不符合歸為一類化為一個表的初衷嘛
不說能不能化行為列
就算可以換行成列那又有什麼意思呢?
完全沒有意義嘛
而且在實際開發中也不會有化行成列的需求
㈣ sql行轉列
SELECT e.NAME as name,
count(case when DATEPART(year,c.START_TIME)=2014 then 1 else null end ) as count2014,
count(case when DATEPART(year,c.START_TIME)=2015 then 1 else null end ) as count2015
from ENVI_DATA_STATISTIC_COMP c
LEFT JOIN ENVI_CITY e on e.CITY_ID=c.CITY_ID
where c.COMP_NAME like '%藍天白雲%' and INDEX_TYPE='12'
and (c.START_TIME like '%2014-08%' or c.START_TIME like '%2015-08%' ) and STATISTIC_TYPE='1' and c.VALID_FLAG='1'
group by name
應該是醬紫的,使用case when 轉換~
㈤ sql server 行轉列
創建測試表
createtabletest
(_keyvarchar(10),
_valuevarchar(10),
idint)
insertintotestvalues('ceshi','測試值',10)
insertintotestvalues('ceshi','測試值',11)
insertintotestvalues('ceshi2','測試值2',11)
執行
declare@sqlvarchar(4000)
set@sql='selectid'
select@sql=@sql+',max(case_keywhen'''+[_key]+'''then[_value]end)as
['+_key+']'
from(selectdistinct_keyfromtest)asa
select@sql=@sql+'fromtestgroupbyid'
exec(@sql)
結果
額,我那個第三條數據id寫錯了,不過方法還是這個
㈥ SQL語句,行變列,請高手指點
樓主,你好!SQL行列轉換我有參照過別人的,現在貼出來給你看看。
/*
標題:普通行列轉換(version2.0)
作者:愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開)
時間:-03-09
地點:廣東深圳
說明:普通行列轉換(version1.0)僅針對sqlserver2000提供靜態和動態寫法,version2.0增加sqlserver2005的有關寫法。
問題:假設有張學生成績表(tb)如下:
姓名課程分數
張三語文74
張三數學83
張三物理93
李四語文74
李四數學84
李四物理94
想變成(得到如下結果):
姓名語文數學物理
----------------
李四748494
張三748393
-------------------
*/
createtabletb(姓名varchar(10),課程varchar(10),分數int)
insertintotbvalues('張三','語文',74)
insertintotbvalues('張三','數學',83)
insertintotbvalues('張三','物理',93)
insertintotbvalues('李四','語文',74)
insertintotbvalues('李四','數學',84)
insertintotbvalues('李四','物理',94)
go
--SQLSERVER2000靜態SQL,指課程只有語文、數學、物理這三門課程。(以下同)
select姓名as姓名,
max(case課程when'語文'then分數else0end)語文,
max(case課程when'數學'then分數else0end)數學,
max(case課程when'物理'then分數else0end)物理
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')
---------------------------------
/*
問題:在上述結果的基礎上加平均分,總分,得到如下結果:
姓名語文數學物理平均分總分
--------------------------
李四74849484.00252
張三74839383.33250
*/
--SQLSERVER2000靜態SQL。
select姓名姓名,
max(case課程when'語文'then分數else0end)語文,
max(case課程when'數學'then分數else0end)數學,
max(case課程when'物理'then分數else0end)物理,
cast(avg(分數*1.0)asdecimal(18,2))平均分,
sum(分數)總分
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+',cast(avg(分數*1.0)asdecimal(18,2))平均分,sum(分數)總分fromtbgroupby姓名'
exec(@sql)
--SQLSERVER2005靜態SQL。
selectm.*,n.平均分,n.總分from
(select*from(select*fromtb)apivot(max(分數)for課程in(語文,數學,物理))b)m,
(select姓名,cast(avg(分數*1.0)asdecimal(18,2))平均分,sum(分數)總分fromtbgroupby姓名)n
wherem.姓名=n.姓名
--SQLSERVER2005動態SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+',','')+課程fromtbgroupby課程
exec('selectm.*,n.平均分,n.總分from
(select*from(select*fromtb)apivot(max(分數)for課程in('+@sql+'))b)m,
(select姓名,cast(avg(分數*1.0)asdecimal(18,2))平均分,sum(分數)總分fromtbgroupby姓名)n
wherem.姓名=n.姓名')
droptabletb
------------------
------------------
/*
問題:如果上述兩表互相換一下:即表結構和數據為:
姓名語文數學物理
張三74
李四74
想變成(得到如下結果):
姓名課程分數
------------
李四語文74
李四數學84
李四物理94
張三語文74
張三數學83
張三物理93
--------------
*/
createtabletb(姓名varchar(10),語文int,數學int,物理int)
insertintotbvalues('張三',74,83,93)
insertintotbvalues('李四',74,84,94)
go
--SQLSERVER2000靜態SQL。
select*from
(
select姓名,課程='語文',分數=語文fromtb
unionall
select姓名,課程='數學',分數=數學fromtb
unionall
select姓名,課程='物理',分數=物理fromtb
)t
orderby姓名,case課程when'語文'then1when'數學'then2when'物理'then3end
--SQLSERVER2000動態SQL。
--調用系統表動態生態。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+'unionall','')+'select姓名,[課程]='+quotename(Name,'''')+',[分數]='+quotename(Name)+'fromtb'
fromsyscolumns
wherename!=N'姓名'andID=object_id('tb')--表名tb,不包含列名為姓名的其它列
orderbycolidasc
exec(@sql+'orderby姓名')
--SQLSERVER2005動態SQL。
select姓名,課程,分數fromtbunpivot(分數for課程in([語文],[數學],[物理]))t
--SQLSERVER2005動態SQL,同SQLSERVER2000動態SQL。
--------------------
/*
問題:在上述的結果上加個平均分,總分,得到如下結果:
姓名課程分數
----------------
李四語文74.00
李四數學84.00
李四物理94.00
李四平均分84.00
李四總分252.00
張三語文74.00
張三數學83.00
張三物理93.00
張三平均分83.33
張三總分250.00
------------------
*/
select*from
(
select姓名as姓名,課程='語文',分數=語文fromtb
unionall
select姓名as姓名,課程='數學',分數=數學fromtb
unionall
select姓名as姓名,課程='物理',分數=物理fromtb
unionall
select姓名as姓名,課程='平均分',分數=cast((語文+數學+物理)*1.0/3asdecimal(18,2))fromtb
unionall
select姓名as姓名,課程='總分',分數=語文+數學+物理fromtb
)t
orderby姓名,case課程when'語文'then1when'數學'then2when'物理'then3when'平均分'then4when'總分'then5end
droptabletb
希望能幫助到你
㈦ 寫sql,怎麼將查詢結果的行列轉換呀
有意思的問題 給出一個參考的URL: 假設你表是這樣的結構部件 入庫日期 入庫數量 A 1/1 10 A 1/1 5 A 1/2 10 B 1/5 10 其實就是兩種方法,假設你的資料庫是11以前的,只能先定義好查哪天到哪天 然後那麼 selct 部件, sum( decode(入庫日期=1號,入庫數量,0), sum( decode(入庫日期=2號,入庫數量,0), 以此類推 from 入庫表 group BY 部件(原理上就是將不是這天的變成0,再合計)要是Oracle資料庫是11的話,就簡單了,直接pivot搞定 pivot語法就不說了,網上一堆一堆的 ~
㈧ 如何用SQL語句交換一張表的行和列
設 A --源表, B-- 目標表
列轉行: A有幾個欄位,B就有幾條記錄
行轉列: A有幾個記錄,B就有幾個欄位
所以,前提條件是A表是固定的,才好操作。不然可就不好實現了。
更細致的操作就不跟這里寫了。
㈨ 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
試試吧,數據雖然有點出入,但已經說明問題了!!!