日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

SQL Server數(shù)據(jù)庫(kù)和Oracle行轉(zhuǎn)列

 昵稱2495488 2010-08-08

SQL Server數(shù)據(jù)庫(kù)和Oracle行轉(zhuǎn)列的特殊方案描述

文章主要描述的是SQL Server數(shù)據(jù)庫(kù)和Oracle數(shù)據(jù)庫(kù)行轉(zhuǎn)列的一種比較典型操作方法,對(duì)于有些業(yè)務(wù)來(lái)說(shuō),數(shù)據(jù)在表中的存儲(chǔ)與其最終的Grid表現(xiàn)恰好相當(dāng)于把源表倒轉(zhuǎn),那么這個(gè)時(shí)候我們就碰到了如何把行轉(zhuǎn)化為列的問(wèn)題。

為了簡(jiǎn)化問(wèn)題,我們且看如下查詢出來(lái)的數(shù)據(jù),您不必關(guān)心表的設(shè)計(jì)以及sql語(yǔ)句:

對(duì)于有些業(yè)務(wù)來(lái)說(shuō),數(shù)據(jù)在表中的存儲(chǔ)和其最終的Grid表現(xiàn)恰好相當(dāng)于把源表倒轉(zhuǎn),那么這個(gè)時(shí)候我們就碰到了如何把行轉(zhuǎn)化為列的問(wèn)題,為了簡(jiǎn)化問(wèn)題,我們且看如下查詢出來(lái)的數(shù)據(jù),您不必關(guān)心表的設(shè)計(jì)以及sql語(yǔ)句:

假設(shè)用到的sql語(yǔ)句為:

SELECT [姓名],[時(shí)代],[金錢] FROM [test].[dbo].[people]

這個(gè)表存儲(chǔ)了兩個(gè)人在不同時(shí)代(時(shí)代是固定的三個(gè):年輕、中年和老年)擁有的金幣,其中:

張三在年輕、中年和老年時(shí)期分別擁有1000、5000、800個(gè)金幣;

李四在年輕、中年和老年時(shí)期分別擁有1200、6000、500個(gè)金幣。

現(xiàn)在我們想把兩人在不同階段擁有的金幣用類似如下的表格來(lái)展現(xiàn):

姓名 年輕 中年 老年

張三 1000 5000 800

李四 1200 6000 500

我們現(xiàn)在考慮用最簡(jiǎn)單和直接的辦法來(lái)實(shí)現(xiàn),其實(shí)關(guān)鍵是如何創(chuàng)建那些需要增加的列,且如何設(shè)定其值,現(xiàn)在我們來(lái)創(chuàng)建“年輕”列,關(guān)鍵的問(wèn)題是,這一列的值如何設(shè)定?合法的邏輯應(yīng)該是這樣:如果該行不是“年輕”時(shí)代,那么其“金錢”我們認(rèn)為是0,那么sql語(yǔ)句如何寫(xiě)呢?

如果是用的SQL Server數(shù)據(jù)庫(kù),那么肯定要用到case了:

case[時(shí)代] when '年輕' then [金錢] else 0 end as 年輕 或 case when[時(shí)代]= '年輕' then [金錢] else 0 end as 年輕

如果用的是oracle,那么要用到decode函數(shù),decode(1+1,3,'錯(cuò)',2,'是',5,'錯(cuò)','都不滿足下返回的值'),這個(gè)函數(shù)將返回“是”,具體用法限于篇幅這里不再介紹,相信大家從這個(gè)式子可以大概了解到其意思,用decode創(chuàng)建“年輕”列的句子是:完整的sql語(yǔ)句如下所示:

decode(時(shí)代,'年輕',金錢,0)) 年輕

SELECT [姓名],[時(shí)代],[金錢], 

case[時(shí)代] when '年輕' then [金錢] else 0 end as 年輕,

case[時(shí)代] when '中年' then [金錢] else 0 end as 中年,

case[時(shí)代] when '老年' then [金錢] else 0 end as 老年 

FROM [test].[dbo].[people] 

現(xiàn)在我們來(lái)看看其執(zhí)行結(jié)果:

相信看到這個(gè)結(jié)果,大家都知道下一步該做什么,那就是分組:按姓名分組,并且對(duì)三個(gè)時(shí)代的金錢進(jìn)行求和:

select [姓名],sum([年輕]) as 年輕,sum([中年]) as 中年,sum([老年]) as 老年 from

(SELECT [姓名],[時(shí)代],[金錢], 

case[時(shí)代] when '年輕' then [金錢] else 0 end as 年輕,

case[時(shí)代] when '中年' then [金錢] else 0 end as 中年,

case[時(shí)代] when '老年' then [金錢] else 0 end as 老年 

FROM [test].[dbo].[people]) t

group by [姓名]

這里用到了子查詢,是為了邏輯更清晰一點(diǎn),其實(shí)可以不用子查詢;至于oracle下的sql語(yǔ)句,除了要使用decode之外,其余幾乎一致,本人正是在oracle中實(shí)現(xiàn)之后才研究了下SQL Server數(shù)據(jù)庫(kù)下的實(shí)現(xiàn)方式。

最后看看結(jié)果:

事實(shí)上,當(dāng)列不固定的時(shí)候,比如除了“年輕”、“中年”、“老年”以外還有其他的未知的時(shí)代,實(shí)現(xiàn)思路其實(shí)基本一致,只是需要?jiǎng)討B(tài)生成sql而已。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多