最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語(yǔ)句

 更新時(shí)間:2009年08月29日 16:35:36   作者:  
在數(shù)據(jù)庫(kù)開(kāi)發(fā)中經(jīng)常會(huì)遇到行列轉(zhuǎn)換的問(wèn)題,比如下面的問(wèn)題,部門(mén),員工和員工類(lèi)型三張表,我們要統(tǒng)計(jì)類(lèi)似這樣的列表
一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換
Author: eaglet
在數(shù)據(jù)庫(kù)開(kāi)發(fā)中經(jīng)常會(huì)遇到行列轉(zhuǎn)換的問(wèn)題,比如下面的問(wèn)題,部門(mén),員工和員工類(lèi)型三張表,我們要統(tǒng)計(jì)類(lèi)似這樣的列表
部門(mén)編號(hào) 部門(mén)名稱(chēng) 合計(jì) 正式員工 臨時(shí)員工 辭退員工
1 A 30 20 10 1
這種問(wèn)題咋一看摸不著頭緒,不過(guò)把思路理順后再看,本質(zhì)就是一個(gè)行列轉(zhuǎn)換的問(wèn)題。下面我結(jié)合這個(gè)簡(jiǎn)單的例子來(lái)實(shí)現(xiàn)行列轉(zhuǎn)換。
下面3張表
復(fù)制代碼 代碼如下:

if exists ( select * from sysobjects where id = object_id ( ' EmployeeType ' ) and type = ' u ' )
drop table EmployeeType
GO
if exists ( select * from sysobjects where id = object_id ( ' Employee ' ) and type = ' u ' )
drop table Employee
GO
if exists ( select * from sysobjects where id = object_id ( ' Department ' ) and type = ' u ' )
drop table Department
GO
create table Department
(
Id int primary key ,
Department varchar ( 10 )
)
create table Employee
(
EmployeeId int primary key ,
DepartmentId int Foreign Key (DepartmentId) References Department(Id) , -- DepartmentId ,
EmployeeName varchar ( 10 )
)
create table EmployeeType
(
EmployeeId int Foreign Key (EmployeeId) References Employee(EmployeeId) , -- EmployeeId ,
EmployeeType varchar ( 10 )
)

描述部門(mén),員工和員工類(lèi)型之間的關(guān)系。
插入測(cè)試數(shù)據(jù)
復(fù)制代碼 代碼如下:

insert Department values ( 1 , ' A ' );
insert Department values ( 2 , ' B ' );
insert Employee values ( 1 , 1 , ' Bob ' );
insert Employee values ( 2 , 1 , ' John ' );
insert Employee values ( 3 , 1 , ' May ' );
insert Employee values ( 4 , 2 , ' Tom ' );
insert Employee values ( 5 , 2 , ' Mark ' );
insert Employee values ( 6 , 2 , ' Ken ' );
insert EmployeeType values ( 1 , ' 正式 ' );
insert EmployeeType values ( 2 , ' 臨時(shí) ' );
insert EmployeeType values ( 3 , ' 正式 ' );
insert EmployeeType values ( 4 , ' 正式 ' );
insert EmployeeType values ( 5 , ' 辭退 ' );
insert EmployeeType values ( 6 , ' 正式 ' );

看一下部門(mén)、員工和員工類(lèi)型的列表
Department EmployeeName EmployeeType
---------- ------------ ------------
A Bob 正式
A John 臨時(shí)
A May 正式
B Tom 正式
B Mark 辭退
B Ken 正式
現(xiàn)在我們需要輸出這樣一個(gè)列表
部門(mén)編號(hào) 部門(mén)名稱(chēng) 合計(jì) 正式員工 臨時(shí)員工 辭退員工
這個(gè)問(wèn)題我的思路是首先統(tǒng)計(jì)每個(gè)部門(mén)的員工類(lèi)型總數(shù)
這個(gè)比較簡(jiǎn)單,我把它做成一個(gè)視圖
復(fù)制代碼 代碼如下:

if exists ( select * from sysobjects where id = object_id ( ' VDepartmentEmployeeType ' ) and type = ' v ' )
drop view VDepartmentEmployeeType
GO
create view VDepartmentEmployeeType
as
select Department.Id, Department.Department, EmployeeType.EmployeeType, count (EmployeeType.EmployeeType) Cnt
from Department, Employee, EmployeeType where
Department.Id = Employee.DepartmentId and Employee.EmployeeId = EmployeeType.EmployeeId
group by Department.Id, Department.Department, EmployeeType.EmployeeType
GO

現(xiàn)在 select * from VDepartmentEmployeeType
Id Department EmployeeType Cnt
----------- ---------- ------------ -----------
2 B 辭退 1
1 A 臨時(shí) 1
1 A 正式 2
2 B 正式 2
有了這個(gè)結(jié)果,我們?cè)偻ㄟ^(guò)行列轉(zhuǎn)換,就可以實(shí)現(xiàn)要求的輸出了
行列轉(zhuǎn)換采用 case 分支語(yǔ)句來(lái)實(shí)現(xiàn),如下:
復(fù)制代碼 代碼如下:

select Id as ' 部門(mén)編號(hào) ' , Department as ' 部門(mén)名稱(chēng) ' ,
[ 正式 ] = Sum ( case when EmployeeType = ' 正式 ' then Cnt else 0 end ),
[ 臨時(shí) ] = Sum ( case when EmployeeType = ' 臨時(shí) ' then Cnt else 0 end ),
[ 辭退 ] = Sum ( case when EmployeeType = ' 辭退 ' then Cnt else 0 end ),
[ 合計(jì) ] = Sum ( case when EmployeeType <> '' then Cnt else 0 end )
from VDepartmentEmployeeType
GROUP BY Id, Department

看一下結(jié)果
部門(mén)編號(hào) 部門(mén)名稱(chēng) 正式 臨時(shí) 辭退 合計(jì)
----------- ---------- ----------- ----------- ----------- -----------
1 A 2 1 0 3
2 B 2 0 1 3
現(xiàn)在還有一個(gè)問(wèn)題,如果員工類(lèi)型不可以應(yīng)編碼怎么辦?也就是說(shuō)我們?cè)趯?xiě)程序的時(shí)候并不知道有哪些員工類(lèi)型。這確實(shí)是一個(gè)
比較棘手的問(wèn)題,不過(guò)不是不能解決,我們可以通過(guò)拼接SQL的方式來(lái)解決這個(gè)問(wèn)題??聪旅娲a
復(fù)制代碼 代碼如下:

DECLARE
@s VARCHAR ( max )
SELECT @s = isnull ( @s + ' , ' , '' ) + ' [ ' + ltrim (EmployeeType) + ' ] = ' +
' Sum(case when EmployeeType = ''' +
EmployeeType + ''' then Cnt else 0 end) '
FROM ( SELECT DISTINCT EmployeeType FROM VDepartmentEmployeeType ) temp
EXEC ( ' select Id as 部門(mén)編號(hào), Department as 部門(mén)名稱(chēng), ' + @s +
' ,[合計(jì)]= Sum(case when EmployeeType <> '''' then Cnt else 0 end) ' +
' from VDepartmentEmployeeType GROUP BY Id, Department ' )

執(zhí)行結(jié)果如下:
部門(mén)編號(hào) 部門(mén)名稱(chēng) 辭退 臨時(shí) 正式 合計(jì)
----------- ---------- ----------- ----------- ----------- -----------
1 A 0 1 2 3
2 B 1 0 2 3
這個(gè)結(jié)果和前面硬編碼的結(jié)果是一樣的,但我們通過(guò)程序來(lái)獲取了所有的員工類(lèi)型,這樣做的好處是如果我們新增了一個(gè)員工類(lèi)型,比如“合同工”,我們不需要修改程序,就可以得到我們想要的輸出。

如果你的數(shù)據(jù)庫(kù)是SQLSERVER 2005 或以上,也可以采用SQLSERVER2005 通過(guò)的新功能 PIVOT
復(fù)制代碼 代碼如下:

SELECT Id as ' 部門(mén)編號(hào) ' , Department as ' 部門(mén)名稱(chēng) ' , [ 正式 ] , [ 臨時(shí) ] , [ 辭退 ]
FROM
( SELECT Id,Department,EmployeeType,Cnt
FROM VDepartmentEmployeeType) p
PIVOT
( SUM (Cnt)
FOR EmployeeType IN ( [ 正式 ] , [ 臨時(shí) ] , [ 辭退 ] )
) AS unpvt

結(jié)果如下
部門(mén)編號(hào) 部門(mén)名稱(chēng) 正式 臨時(shí) 辭退
----------- ---------- ----------- ----------- -----------
1 A 2 1 NULL
2 B 2 NULL 1
NULL 可以通過(guò) ISNULL 函數(shù)來(lái)強(qiáng)制轉(zhuǎn)換為0,這里我就不寫(xiě)出具體的SQL語(yǔ)句了。這個(gè)功能感覺(jué)還是不錯(cuò),不過(guò)合計(jì)好像用這種方法不太好搞。不知道各位同行有沒(méi)有什么好辦法。

相關(guān)文章

  • SQL Server 向臨時(shí)表插入數(shù)據(jù)示例

    SQL Server 向臨時(shí)表插入數(shù)據(jù)示例

    SQL Server 向臨時(shí)表插入數(shù)據(jù),用臨時(shí)表和表變量代替游標(biāo)會(huì)極大的提高性能,下面有個(gè)示例,大家可以參考下
    2014-06-06
  • SQL Server中分區(qū)表的用法

    SQL Server中分區(qū)表的用法

    本文詳細(xì)講解了SQL Server中分區(qū)表的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 簡(jiǎn)化SQL Server備份與還原到云工作原理及操作方法

    簡(jiǎn)化SQL Server備份與還原到云工作原理及操作方法

    您可以使用 SQL Server 的本機(jī)備份功能來(lái)備份您的 SQL Server Database到 Windows AzureBlob 存儲(chǔ)服務(wù),也可以使用 T-SQL 和SMO備份到Windows AzureBlob存儲(chǔ),感興趣的可以了解下本文,或許可以幫助到你
    2013-02-02
  • 數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程代碼

    數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程代碼

    數(shù)據(jù)庫(kù)分頁(yè)存儲(chǔ)過(guò)程代碼...
    2007-04-04
  • SQL Server中實(shí)現(xiàn)自定義數(shù)據(jù)加密功能

    SQL Server中實(shí)現(xiàn)自定義數(shù)據(jù)加密功能

    在當(dāng)今數(shù)字化時(shí)代,數(shù)據(jù)安全已成為企業(yè)和個(gè)人最為關(guān)注的問(wèn)題之一,SQL Server提供了多種數(shù)據(jù)加密技術(shù),包括透明數(shù)據(jù)加密(TDE)、備份加密以及列級(jí)加密等,本文將詳細(xì)介紹如何在SQL Server中實(shí)現(xiàn)自定義數(shù)據(jù)加密功能,需要的朋友可以參考下
    2024-08-08
  • Mysql中悲觀鎖與樂(lè)觀鎖應(yīng)用介紹

    Mysql中悲觀鎖與樂(lè)觀鎖應(yīng)用介紹

    樂(lè)觀鎖對(duì)應(yīng)于生活中樂(lè)觀的人總是想著事情往好的方向發(fā)展,悲觀鎖對(duì)應(yīng)于生活中悲觀的人總是想著事情往壞的方向發(fā)展.這兩種人各有優(yōu)缺點(diǎn),不能不以場(chǎng)景而定說(shuō)一種人好于另外一種人,文中詳細(xì)介紹了悲觀鎖與樂(lè)觀鎖,需要的朋友可以參考下
    2022-08-08
  • 必須會(huì)的SQL語(yǔ)句(七) 字符串函數(shù)、時(shí)間函數(shù)

    必須會(huì)的SQL語(yǔ)句(七) 字符串函數(shù)、時(shí)間函數(shù)

    這篇文章主要介紹了sqlserver中字符串函數(shù)、時(shí)間函數(shù)使用方法,需要的朋友可以參考下
    2015-01-01
  • SQL Server 總結(jié)復(fù)習(xí)(一)

    SQL Server 總結(jié)復(fù)習(xí)(一)

    寫(xiě)這篇文章,主要是總結(jié)最近學(xué)到的一些新知識(shí),這些特性不一定是SQLSERVER最新版才有,大多數(shù)是2008新特性,有些甚至是更早。如果有不懂的地方,建議大家去百度谷歌搜搜,本文不做詳細(xì)闡述,有錯(cuò)誤的地方,歡迎大家批評(píng)指正
    2012-08-08
  • 海量數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句

    海量數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句

    在以下的文章中,我將以“辦公自動(dòng)化”系統(tǒng)為例,探討如何在有著1000萬(wàn)條數(shù)據(jù)的MS SQL SERVER數(shù)據(jù)庫(kù)中實(shí)現(xiàn)快速的數(shù)據(jù)提取和數(shù)據(jù)分頁(yè)。
    2009-10-10
  • SQL查詢(xún)服務(wù)器下所有數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)的全部表

    SQL查詢(xún)服務(wù)器下所有數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)的全部表

    這篇文章主要介紹了SQL查詢(xún)服務(wù)器下所有數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的全部表,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

泸西县| 福鼎市| 开远市| 贵定县| 武邑县| 牟定县| 沙田区| 琼结县| 古浪县| 彰化市| 盐边县| 株洲市| 繁昌县| 嘉定区| 鄂伦春自治旗| 丽水市| 陵川县| 江川县| 武宁县| 肥西县| 桑日县| 阿拉善盟| 游戏| 雅江县| 青岛市| 西昌市| 秦皇岛市| 康乐县| 常熟市| 普宁市| 望江县| 渭南市| 乌鲁木齐市| 广汉市| 溧阳市| 绵竹市| 融水| 襄汾县| 利辛县| 龙南县| 五大连池市|