濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > table 行轉(zhuǎn)列的sql詳解

table 行轉(zhuǎn)列的sql詳解

熱門標(biāo)簽:分享百度地圖標(biāo)注多個(gè)位置 湖南電腦外呼系統(tǒng)平臺(tái) 電銷機(jī)器人公司 需要哪些牌照 長(zhǎng)沙智能外呼系統(tǒng) 廣東防封卡外呼系統(tǒng)原理是什么 地圖標(biāo)注牌 外呼系統(tǒng)改進(jìn) 知名電銷機(jī)器人價(jià)格 菏澤語(yǔ)音電銷機(jī)器人加盟公司
一、要求
1 創(chuàng)建數(shù)據(jù)表
CREATE TABLE [dbo].[StuScore](
[stuid] [int] NOT NULL,
[subject] [nvarchar](30) NULL,
[score] [decimal](5, 1) NULL
)
2 插入測(cè)試數(shù)據(jù)
stuid subject score
3 chinese 76.0
3 math 73.0
4 chinese 82.0
5 chinese 66.0
5 math 93.0
6 chinese 67.0
7 math 83.0
8 chinese 77.0
8 math 84.0
3 行轉(zhuǎn)列后的結(jié)果
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
二 、分析
1 行轉(zhuǎn)列,一個(gè)重點(diǎn)就是怎么樣知道有多少列,怎么樣創(chuàng)建這些列?我們可以先把這個(gè)問(wèn)題擱置,而假設(shè)這些列是已知的。 例如示例數(shù)據(jù)中,可以先假設(shè)subject的數(shù)據(jù)[chinese,math]是已知的,這樣問(wèn)題就簡(jiǎn)化了許多
2 當(dāng)已知了chinese,math后,我們至少要先得到轉(zhuǎn)換后的tabel結(jié)構(gòu)
如下;
select stuid, 0 as chinese, 0 as math from dbo.StuScore
結(jié)果如下
stuid chinese math
3 0 0
3 0 0
4 0 0
5 0 0
5 0 0
6 0 0
7 0 0
8 0 0
8 0 0
3 接著就需要往這個(gè)數(shù)據(jù)集中去填充chinese, math的數(shù)據(jù)
select stuid,
case subject when 'chinese' then score else 0 end as chinese,
case subject when 'math' then score else 0 end as math
from dbo.StuScore
結(jié)果如下:
stuid chinese math
3 76.0 0.0
3 0.0 73.0
4 82.0 0.0
5 66.0 0.0
5 0.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 0.0
8 0.0 84.0
4 細(xì)心的讀者會(huì)發(fā)現(xiàn)步驟3中的結(jié)果與我們想要的已經(jīng)非常接近了,只需再做一個(gè)sum()處理,就OK了
select stuid,
sum(case subject when 'chinese' then score else 0 end ) as chinese,
sum(case subject when 'math' then score else 0 end ) as math
from dbo.StuScore group by stuid
得到的正是我們想要的結(jié)果
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
是不是現(xiàn)在就已經(jīng)完成了呢?答案是否定的。前面我們已經(jīng)說(shuō)過(guò),是為了簡(jiǎn)化問(wèn)題,在假設(shè)已經(jīng)知道了subject數(shù)據(jù)的情況下,這么處理的,實(shí)際上subject的數(shù)據(jù)是可變的,未知的,接下來(lái)就是要解決這個(gè)問(wèn)題了
5 要獲取subject的數(shù)據(jù)其實(shí)很簡(jiǎn)單
select distinct subject from dbo.StuScore
獲取以后怎樣得到case subject when 'chinese' then score else 0 end 這種語(yǔ)句?
可以根據(jù)subject的值去動(dòng)態(tài)的組sql語(yǔ)句
看下面的一段代碼
declare @sql varchar(2000)
set @sql=''
select @sql =@sql+ ',case subject when '''+subject+''' then 1 else 0 end as ' + subject
from (select distinct subject from dbo.StuScore) as sub
print @sql
message打印的信息如下:
,case subject when 'chinese' then 1 else 0 end as chinese,case subject when 'math' then 1 else 0 end as math
6 最后我們就需要將前面步驟綜合起來(lái),得到最終的sql
declare @sql varchar(2000)
set @sql='select stuid'
select @sql =@sql+ ',sum(case subject when '''+subject+''' then score else 0 end) as ' + subject
from (select distinct subject from dbo.StuScore) as sub
set @sql=@sql + ' from dbo.StuScore group by stuid'
exec(@sql)
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
至此,整個(gè)分析過(guò)程和結(jié)果就都出來(lái)了。
初試寫文章, 多包涵,指正。
您可能感興趣的文章:
  • mysql 行轉(zhuǎn)列和列轉(zhuǎn)行實(shí)例詳解
  • sql語(yǔ)句實(shí)現(xiàn)行轉(zhuǎn)列的3種方法實(shí)例
  • SQLServer行轉(zhuǎn)列實(shí)現(xiàn)思路記錄
  • MySQL存儲(chǔ)過(guò)程中使用動(dòng)態(tài)行轉(zhuǎn)列
  • mssql 數(shù)據(jù)庫(kù)表行轉(zhuǎn)列,列轉(zhuǎn)行終極方案
  • Sql Server 2000 行轉(zhuǎn)列的實(shí)現(xiàn)(橫排)
  • SQL查詢語(yǔ)句行轉(zhuǎn)列橫向顯示實(shí)例解析
  • sql動(dòng)態(tài)行轉(zhuǎn)列的兩種方法
  • SQL行轉(zhuǎn)列和列轉(zhuǎn)行代碼詳解
  • SQL基礎(chǔ)教程之行轉(zhuǎn)列Pivot函數(shù)

標(biāo)簽:西寧 商洛 天水 呼和浩特 珠海 美容院 泉州 福建

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《table 行轉(zhuǎn)列的sql詳解》,本文關(guān)鍵詞  table,行轉(zhuǎn)列,的,sql,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《table 行轉(zhuǎn)列的sql詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于table 行轉(zhuǎn)列的sql詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    汤阴县| 广元市| 内江市| 中阳县| 江北区| 许昌市| 河池市| 吴桥县| 迁安市| 邢台市| 永昌县| 平罗县| 威远县| 交口县| 凤凰县| 五大连池市| 栖霞市| 凭祥市| 铁岭市| 泾源县| 迁安市| 闽侯县| 桂林市| 马龙县| 偃师市| 隆化县| 徐水县| 沂南县| 湘乡市| 辛集市| 长海县| 平原县| 河东区| 逊克县| 杭锦旗| 菏泽市| 阜宁县| 南和县| 静乐县| 炉霍县| 荆门市|