婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 一個簡單的SQL 行列轉換語句

一個簡單的SQL 行列轉換語句

熱門標簽:知名電銷機器人價格 外呼系統改進 長沙智能外呼系統 地圖標注牌 湖南電腦外呼系統平臺 廣東防封卡外呼系統原理是什么 分享百度地圖標注多個位置 電銷機器人公司 需要哪些牌照 菏澤語音電銷機器人加盟公司
一個簡單的SQL 行列轉換
Author: eaglet
在數據庫開發中經常會遇到行列轉換的問題,比如下面的問題,部門,員工和員工類型三張表,我們要統計類似這樣的列表
部門編號 部門名稱 合計 正式員工 臨時員工 辭退員工
1 A 30 20 10 1
這種問題咋一看摸不著頭緒,不過把思路理順后再看,本質就是一個行列轉換的問題。下面我結合這個簡單的例子來實現行列轉換。
下面3張表
復制代碼 代碼如下:

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 )
)

描述部門,員工和員工類型之間的關系。
插入測試數據
復制代碼 代碼如下:

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 , ' 臨時 ' );
insert EmployeeType values ( 3 , ' 正式 ' );
insert EmployeeType values ( 4 , ' 正式 ' );
insert EmployeeType values ( 5 , ' 辭退 ' );
insert EmployeeType values ( 6 , ' 正式 ' );

看一下部門、員工和員工類型的列表
Department EmployeeName EmployeeType
---------- ------------ ------------
A Bob 正式
A John 臨時
A May 正式
B Tom 正式
B Mark 辭退
B Ken 正式
現在我們需要輸出這樣一個列表
部門編號 部門名稱 合計 正式員工 臨時員工 辭退員工
這個問題我的思路是首先統計每個部門的員工類型總數
這個比較簡單,我把它做成一個視圖
復制代碼 代碼如下:

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

現在 select * from VDepartmentEmployeeType
Id Department EmployeeType Cnt
----------- ---------- ------------ -----------
2 B 辭退 1
1 A 臨時 1
1 A 正式 2
2 B 正式 2
有了這個結果,我們再通過行列轉換,就可以實現要求的輸出了
行列轉換采用 case 分支語句來實現,如下:
復制代碼 代碼如下:

select Id as ' 部門編號 ' , Department as ' 部門名稱 ' ,
[ 正式 ] = Sum ( case when EmployeeType = ' 正式 ' then Cnt else 0 end ),
[ 臨時 ] = Sum ( case when EmployeeType = ' 臨時 ' then Cnt else 0 end ),
[ 辭退 ] = Sum ( case when EmployeeType = ' 辭退 ' then Cnt else 0 end ),
[ 合計 ] = Sum ( case when EmployeeType > '' then Cnt else 0 end )
from VDepartmentEmployeeType
GROUP BY Id, Department

看一下結果
部門編號 部門名稱 正式 臨時 辭退 合計
----------- ---------- ----------- ----------- ----------- -----------
1 A 2 1 0 3
2 B 2 0 1 3
現在還有一個問題,如果員工類型不可以應編碼怎么辦?也就是說我們在寫程序的時候并不知道有哪些員工類型。這確實是一個
比較棘手的問題,不過不是不能解決,我們可以通過拼接SQL的方式來解決這個問題。看下面代碼
復制代碼 代碼如下:

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 部門編號, Department as 部門名稱, ' + @s +
' ,[合計]= Sum(case when EmployeeType > '''' then Cnt else 0 end) ' +
' from VDepartmentEmployeeType GROUP BY Id, Department ' )

執行結果如下:
部門編號 部門名稱 辭退 臨時 正式 合計
----------- ---------- ----------- ----------- ----------- -----------
1 A 0 1 2 3
2 B 1 0 2 3
這個結果和前面硬編碼的結果是一樣的,但我們通過程序來獲取了所有的員工類型,這樣做的好處是如果我們新增了一個員工類型,比如“合同工”,我們不需要修改程序,就可以得到我們想要的輸出。

如果你的數據庫是SQLSERVER 2005 或以上,也可以采用SQLSERVER2005 通過的新功能 PIVOT
復制代碼 代碼如下:

SELECT Id as ' 部門編號 ' , Department as ' 部門名稱 ' , [ 正式 ] , [ 臨時 ] , [ 辭退 ]
FROM
( SELECT Id,Department,EmployeeType,Cnt
FROM VDepartmentEmployeeType) p
PIVOT
( SUM (Cnt)
FOR EmployeeType IN ( [ 正式 ] , [ 臨時 ] , [ 辭退 ] )
) AS unpvt

結果如下
部門編號 部門名稱 正式 臨時 辭退
----------- ---------- ----------- ----------- -----------
1 A 2 1 NULL
2 B 2 NULL 1
NULL 可以通過 ISNULL 函數來強制轉換為0,這里我就不寫出具體的SQL語句了。這個功能感覺還是不錯,不過合計好像用這種方法不太好搞。不知道各位同行有沒有什么好辦法。
您可能感興趣的文章:
  • mysql 行轉列和列轉行實例詳解
  • mssql 數據庫表行轉列,列轉行終極方案
  • SQL行轉列和列轉行代碼詳解
  • sql語句實現行轉列的3種方法實例
  • SQLServer行轉列實現思路記錄
  • MySQL存儲過程中使用動態行轉列
  • 數據庫實現行列轉換(mysql示例)
  • 深入SQL中PIVOT 行列轉換詳解
  • mysql 列轉行,合并字段的方法(必看)
  • SQL行轉列、列轉行的簡單實現

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

巨人網絡通訊聲明:本文標題《一個簡單的SQL 行列轉換語句》,本文關鍵詞  一個,簡單,的,SQL,行列,轉換,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一個簡單的SQL 行列轉換語句》相關的同類信息!
  • 本頁收集關于一個簡單的SQL 行列轉換語句的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品视频一区二区| av中文一区二区三区| 成人国产免费视频| 亚洲精品在线一区二区| 成人性视频网站| 国产精品电影院| 欧美日韩激情一区二区| 久久精品国产亚洲一区二区三区| 日韩精品在线网站| 国产一区二区美女诱惑| 久久久午夜电影| 91麻豆福利精品推荐| 蜜芽一区二区三区| 亚洲国产精品av| 在线观看日韩毛片| 91麻豆精品一区二区三区| 精品制服美女丁香| 亚洲午夜在线观看视频在线| 色偷偷一区二区三区| 白白色亚洲国产精品| 中文字幕欧美日韩一区| 日韩精品一区二区三区视频在线观看 | 亚洲乱码国产乱码精品精小说 | 亚洲天堂福利av| 日韩一区二区三| 欧美三区在线观看| 国产98色在线|日韩| 日韩不卡在线观看日韩不卡视频| 亚洲影视在线观看| 亚洲综合网站在线观看| 色婷婷综合激情| 成人免费观看av| 国产自产v一区二区三区c| 亚洲午夜av在线| 国产欧美精品在线观看| 国产亚洲va综合人人澡精品| 在线一区二区三区做爰视频网站| 国产综合成人久久大片91| 日日骚欧美日韩| 一区二区三区四区高清精品免费观看 | 91精品国产一区二区三区| 一本色道a无线码一区v| 不卡视频免费播放| 蜜乳av一区二区| 免播放器亚洲一区| 亚洲最大色网站| 五月综合激情婷婷六月色窝| 免费亚洲电影在线| 久国产精品韩国三级视频| 国产麻豆精品在线| 久久99精品网久久| 成人黄色av网站在线| 99国产精品久久久久久久久久久| 91香蕉国产在线观看软件| 色猫猫国产区一区二在线视频| 91视频国产资源| 成人综合激情网| 国产精品456露脸| 91在线一区二区三区| 91丨九色porny丨蝌蚪| 欧美日韩成人一区| www久久精品| 日韩欧美国产午夜精品| 国产午夜精品久久| 一区二区三区欧美亚洲| 久久精品国产在热久久| 亚洲成av人片一区二区梦乃 | 不卡区在线中文字幕| 欧美亚洲动漫制服丝袜| 欧美系列日韩一区| 欧美一级国产精品| 中文av一区特黄| 亚洲一级二级在线| 日本成人在线电影网| 亚洲成人精品在线观看| 99久久免费国产| 国产精品色一区二区三区| 欧美午夜一区二区| 久久精品久久精品| 伊人性伊人情综合网| 国产欧美一区二区精品秋霞影院| 在线观看精品一区| 99久久久精品| 狠狠色狠狠色合久久伊人| 亚洲亚洲精品在线观看| 欧美国产精品v| 日韩一区二区不卡| 欧美日本高清视频在线观看| 成人小视频免费在线观看| 蜜桃视频在线观看一区| 亚洲女爱视频在线| 欧美高清在线一区二区| 精品人在线二区三区| 欧美精品在线观看播放| av欧美精品.com| 韩国一区二区在线观看| 久久精品国产久精国产| 亚洲成人午夜电影| 亚洲综合偷拍欧美一区色| 中文字幕精品三区| 中文字幕高清不卡| 国产欧美一区二区三区网站 | 国产91精品免费| 国产在线不卡一区| 久久成人免费日本黄色| 蜜桃精品视频在线| 日本一区中文字幕| 美国毛片一区二区三区| 日本欧美肥老太交大片| 青青国产91久久久久久| 首页综合国产亚洲丝袜| 午夜视黄欧洲亚洲| 日本午夜精品视频在线观看| 午夜精品久久久久影视| 日韩av午夜在线观看| 日一区二区三区| 免费视频一区二区| 麻豆国产欧美日韩综合精品二区| 91国在线观看| 欧美日韩免费一区二区三区视频 | 麻豆精品久久久| 另类调教123区| 国产精品影视在线观看| 国产麻豆视频精品| 99热在这里有精品免费| 色88888久久久久久影院按摩| 欧美日韩精品电影| 精品久久久久一区二区国产| 久久久久国产精品厨房| 亚洲免费av观看| 亚洲成人av免费| 国产真实乱偷精品视频免| 成人福利视频在线看| 欧美综合一区二区三区| 欧美成人伊人久久综合网| 国产无一区二区| 亚洲国产aⅴ成人精品无吗| 麻豆视频一区二区| 成人app网站| 337p亚洲精品色噜噜噜| 日韩亚洲欧美在线| 日韩理论电影院| 水蜜桃久久夜色精品一区的特点| 国产二区国产一区在线观看| 91丨九色丨黑人外教| 欧美丰满高潮xxxx喷水动漫| 久久久欧美精品sm网站| 中文字幕在线不卡视频| 蜜桃av噜噜一区二区三区小说| 国产经典欧美精品| 欧美午夜寂寞影院| 国产精品无遮挡| 亚洲va在线va天堂| 丁香六月综合激情| 欧美日韩一区小说| 国产日韩av一区二区| 午夜成人免费视频| 成人美女视频在线观看| 日韩免费观看高清完整版| 亚洲日本免费电影| 激情文学综合插| 日本韩国精品在线| 日韩精品一区二区三区在线播放| 亚洲视频免费在线观看| 美国毛片一区二区| 国产成人精品亚洲777人妖| 欧美日韩国产一区二区三区地区| 久久久久久免费网| 日本特黄久久久高潮| 欧美精品久久久久久久多人混战| 国产精品三级视频| 国产在线一区二区综合免费视频| 色婷婷综合久久久久中文一区二区| 久久先锋影音av| 18涩涩午夜精品.www| 九九国产精品视频| 欧美一区二区在线视频| 亚洲精品一二三四区| av一区二区三区黑人| 精品国产精品一区二区夜夜嗨| 亚洲电影一级片| 一本大道久久精品懂色aⅴ| 久久久久国产免费免费| 久久国产日韩欧美精品| 亚洲丝袜自拍清纯另类| 国产成人免费在线| 日韩精品一区二区三区在线播放| 一区二区三区四区高清精品免费观看| 国产盗摄视频一区二区三区| 日韩欧美亚洲国产另类| 三级影片在线观看欧美日韩一区二区| 色中色一区二区| 国产精品三级视频| 波多野结衣在线一区| 亚洲国产精品ⅴa在线观看| 狠狠狠色丁香婷婷综合激情| 精品蜜桃在线看| 日本欧美加勒比视频| 这里只有精品视频在线观看| 日韩国产欧美在线观看|