對于有些業(yè)務來說,數(shù)據(jù)在表中的存儲和其最終的Grid表現(xiàn)恰好相當于把源表倒轉(zhuǎn),那么這個時候我們就碰到了如何把行轉(zhuǎn)化為列的問題,為了簡化問題,我們且看如下查詢出來的數(shù)據(jù),您不必關心表的設計以及sql語句: 假設用到的sql語句為: SELECT [姓名],[時代],
對于有些業(yè)務來說,數(shù)據(jù)在表中的存儲和其最終的Grid表現(xiàn)恰好相當于把源表倒轉(zhuǎn),那么這個時候我們就碰到了如何把行轉(zhuǎn)化為列的問題,為了簡化問題,我們且看如下查詢出來的數(shù)據(jù),您不必關心表的設計以及sql語句:
假設用到的sql語句為:
SELECT [姓名],[時代],[金錢]
FROM [test].[dbo].[people]
這個表存儲了兩個人在不同時代(時代是固定的三個:年輕、中年和老年)擁有的金幣,其中:
張三在年輕、中年和老年時期分別擁有1000、5000、800個金幣;
李四在年輕、中年和老年時期分別擁有1200、6000、500個金幣。
現(xiàn)在我們想把兩人在不同階段擁有的金幣用類似如下的表格來展現(xiàn):
姓名年輕中年老年
張三10005000800
李四12006000500
我們現(xiàn)在考慮用最簡單和直接的辦法來實現(xiàn),其實關鍵是如何創(chuàng)建那些需要增加的列,且如何設定其值,現(xiàn)在我們來創(chuàng)建“年輕”列,關鍵的問題是,這一列的值如何設定?合法的邏輯應該是這樣:如果該行不是“年輕”時代,那么其“金錢”我們認為是0,那么sql語句如何寫呢?
如果是用的SQL Server,那么肯定要用到case了:
case [時代] when '年輕' then [金錢] else 0 end as 年輕
或
case when [時代]= '年輕' then [金錢] else 0 end as 年輕
如果用的是Oracle,美國空間,那么要用到decode函數(shù),decode(1+1,3,'錯',2,'是',5,'錯','都不滿足下返回的值'),這個函數(shù)將返回“是”,具體用法限于篇幅這里不再介紹,相信大家從這個式子可以大概了解到其意思,用decode創(chuàng)建“年輕”列的句子是:完整的sql語句如下所示:
decode(時代,'年輕',金錢,0)) 年輕
SELECT [姓名],[時代],[金錢],
case [時代] when '年輕' then [金錢] else 0 end as 年輕,
case [時代] when '中年' then [金錢] else 0 end as 中年,
case [時代] when '老年' then [金錢] else 0 end as 老年
FROM [test].[dbo].[people]
現(xiàn)在我們來看看其執(zhí)行結(jié)果:
相信看到這個結(jié)果,大家都知道下一步該做什么,香港虛擬主機,那就是分組:按姓名分組,并且對三個時代的金錢進行求和:
select [姓名],sum([年輕]) as 年輕,sum([中年]) as 中年,sum([老年]) as 老年 from
(SELECT [姓名],[時代],[金錢],
case [時代] when '年輕' then [金錢] else 0 end as 年輕,
case [時代] when '中年' then [金錢] else 0 end as 中年,
case [時代] when '老年' then [金錢] else 0 end as 老年
FROM [test].[dbo].[people]) t
group by [姓名]
這里用到了子查詢,是為了邏輯更清晰一點,服務器空間,其實可以不用子查詢;至于oracle下的sql語句,除了要使用decode之外,其余幾乎一致,本人正是在oracle中實現(xiàn)之后才研究了下sql server下的實現(xiàn)方式。
最后看看結(jié)果:
事實上,當列不固定的時候,比如除了“年輕”、“中年”、“老年”以外還有其他的未知的時代,實現(xiàn)思路其實基本一致,只是需要動態(tài)生成sql而已。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com