玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換
注意:列轉(zhuǎn)行的方法可能是我獨(dú)創(chuàng)的了,呵呵,因?yàn)樵诰W(wǎng)上找不到哦,全部是我自己寫的,用到了系統(tǒng)的SysColumns
(一)行轉(zhuǎn)列的方法
先說(shuō)說(shuō)行轉(zhuǎn)列的方法,這個(gè)就比較好想了,利用拼sql和case when解決即可
實(shí)現(xiàn)目的
1:建立測(cè)試用的數(shù)據(jù)庫(kù)
CREATE TABLE RowTest(
[Name] [nvarchar](10) NULL,--名稱
[Course] [nvarchar](10) NULL,--課程名稱
[Record] [int] NULL--課程的分?jǐn)?shù)
)
2:加入測(cè)試用的數(shù)據(jù)庫(kù)(先加入整齊的數(shù)據(jù))
insert into RowTest values ('張三','語(yǔ)文','91')
insert into RowTest values ('張三','數(shù)學(xué)','92')
insert into RowTest values ('張三','英語(yǔ)','93')
insert into RowTest values ('張三','生物','94')
insert into RowTest values ('張三','物理','95')
insert into RowTest values ('張三','化學(xué)','96')
insert into RowTest values ('李四','語(yǔ)文','81')
insert into RowTest values ('李四','數(shù)學(xué)','82')
insert into RowTest values ('李四','英語(yǔ)','83')
insert into RowTest values ('李四','生物','84')
insert into RowTest values ('李四','物理','85')
insert into RowTest values ('李四','化學(xué)','86')
insert into RowTest values ('小生','語(yǔ)文','71')
insert into RowTest values ('小生','數(shù)學(xué)','72')
insert into RowTest values ('小生','英語(yǔ)','73')
insert into RowTest values ('小生','生物','74')
insert into RowTest values ('小生','物理','75')
insert into RowTest values ('小生','化學(xué)','76')
3:設(shè)計(jì)想法
行轉(zhuǎn)列的原理就是把行的類別找出來(lái)當(dāng)做查詢的字段,利用case when 把當(dāng)前的分?jǐn)?shù)加到當(dāng)前的字段上去,最后用group by 把數(shù)據(jù)整合在一起
4:通用方法
declare @sql nvarchar(max)
set @sql='select Name'
select @sql=@sql+','+'isnull(max( case when Course='''+TCourse.Course+''' then Record end ),0)'+TCourse.Course
from (select distinct Course from RowTest)TCourse
set @sql=@sql+' from RowTest group by Name order by Name'
print @sql
exec(@sql)
說(shuō)明: 把所有的課程名稱取出來(lái)作為列(查詢表TCourse)
用case when 的方法把sql 拼出來(lái)
5:課外試驗(yàn)
(1)加入數(shù)據(jù)
insert into dbo.RowTest values ('小生','生物','110')
去除max 方法會(huì)報(bào)錯(cuò),因?yàn)橐粭l可能對(duì)應(yīng)多行數(shù)據(jù)
(2)加入數(shù)據(jù)
insert into dbo.RowTest values ('小生','計(jì)算機(jī)','110')
數(shù)據(jù)會(huì)多出一列,但是其他人無(wú)此課程就會(huì)為0
至此,數(shù)據(jù)行轉(zhuǎn)列ok
(二)列轉(zhuǎn)行的新方法開(kāi)始了
實(shí)現(xiàn)目的

1:實(shí)現(xiàn)原理
在網(wǎng)上看了別人的做法,基本都是用union all 來(lái)一個(gè)個(gè)轉(zhuǎn)換的,我覺(jué)得不太好用。
首先我想到了要把所有的列名取出來(lái),就在網(wǎng)上查了下獲取表的所有列名
然后我可以把主表和列名形成的表串起來(lái),這樣就可以形成需要的列數(shù),然后根據(jù)判斷取值就完成了了,呵呵
2:建立表格
create table CoulumTest
(
Name nvarchar(10),
語(yǔ)文 int,
數(shù)學(xué) int,
英語(yǔ) int
)
3:加入數(shù)據(jù)
insert into CoulumTest values(N'張三',90,91,92)
insert into CoulumTest values(N'李四',80,81,82)
4:經(jīng)典的地方來(lái)了
select CT.Name,Col.name 課程,
(case when Col.name=N'語(yǔ)文' then CT.語(yǔ)文 when Col.name=N'數(shù)學(xué)' then CT.數(shù)學(xué)
when Col.name=N'英語(yǔ)' then CT.英語(yǔ) end ) as 分?jǐn)?shù) from CoulumTest CT
left join (select name from SysColumns Where id=Object_Id('CoulumTest')) Col on Col.name<>'Name'
你沒(méi)看錯(cuò),一句話搞定,但是有個(gè)問(wèn)題迷惑了我,我覺(jué)得還不夠簡(jiǎn)化,如果可以把case when 都不用了就更好了,請(qǐng)大神們指點(diǎn)小弟一下了。怎么根據(jù)
Col的name 直接取得分?jǐn)?shù)
- sql 普通行列轉(zhuǎn)換
- 一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語(yǔ)句
- sqlserver2005 行列轉(zhuǎn)換實(shí)現(xiàn)方法
- Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實(shí)現(xiàn)行列轉(zhuǎn)換的問(wèn)題小結(jié)
- SQL Server使用PIVOT與unPIVOT實(shí)現(xiàn)行列轉(zhuǎn)換
- MySQL實(shí)現(xiàn)行列轉(zhuǎn)換
- SQL行列轉(zhuǎn)換超詳細(xì)四種方法詳解
- SQL Server行列轉(zhuǎn)換的實(shí)現(xiàn)示例
- SQLServer使用 PIVOT 和 UNPIVOT行列轉(zhuǎn)換
相關(guān)文章
SQL Server 2005恢復(fù)數(shù)據(jù)庫(kù)詳細(xì)圖文教程
這篇文章主要介紹了SQL Server 2005恢復(fù)數(shù)據(jù)庫(kù)詳細(xì)圖文教程,需要的朋友可以參考下2014-11-11
mssql2005數(shù)據(jù)庫(kù)鏡像搭建教程
數(shù)據(jù)庫(kù)鏡像是SQL SERVER 2005用于提高數(shù)據(jù)庫(kù)可用性的新技術(shù)其優(yōu)勢(shì)是以在不丟失已提交數(shù)據(jù)的前提下進(jìn)行快速故障轉(zhuǎn)移,無(wú)須專門的硬件,并且易于配置和管理,本文將如介紹,有需求的朋友可以參考下2012-11-11
SQLServer2005 批量查詢自定義對(duì)象腳本
使用系統(tǒng)函數(shù)object_definition和系統(tǒng)表 sysobjects 就可以了2009-08-08
SQL2005學(xué)習(xí)筆記 APPLY 運(yùn)算符
APPLY 運(yùn)算符簡(jiǎn)介: APPLY 運(yùn)算符是Sql Server2005新增加的運(yùn)算符。2009-07-07
使用SQLSERVER 2005/2008 遞歸CTE查詢樹(shù)型結(jié)構(gòu)的方法
我們經(jīng)常遇到樹(shù)型結(jié)構(gòu),把它們顯示在一個(gè)類似TreeView控件上的情況。這時(shí)我們可以使用Recursive Common Table Expressions(CTE)實(shí)現(xiàn)2011-10-10
SQL2005CLR函數(shù)擴(kuò)展-深入環(huán)比計(jì)算的詳解
環(huán)比就是本月和上月的差值所占上月值的比例。在復(fù)雜的olap計(jì)算中我們經(jīng)常會(huì)用到同比環(huán)比等概念,要求的上個(gè)維度的某個(gè)字段的實(shí)現(xiàn)語(yǔ)句非常簡(jiǎn)練,比如ssas的mdx語(yǔ)句類似[維度].CurrentMember.Prevmember就可以了2013-06-06
SQLServer無(wú)法打開(kāi)用戶默認(rèn)數(shù)據(jù)庫(kù) 登錄失敗錯(cuò)誤4064的解決方法
這篇文章主要介紹了SQLServer無(wú)法打開(kāi)用戶默認(rèn)數(shù)據(jù)庫(kù) 登錄失敗錯(cuò)誤4064的解決方法,需要的朋友可以參考下2015-01-01

