<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Dev Guide: js | css | HTML(DOM) WEBCAST .NET4 Lib Web.config-WCF MVC3-EF4.1 T-SQL-(2012)

      Transact-SQL 使用 PIVOT 和 UNPIVOT 實現行與列之間的轉化

      I:使用 PIVOT 和 UNPIVOT 命令的SQL Server版本要求

      1.數據庫的最低版本要求為 SQL Server 2005 或 更高

      2.必須將數據庫的兼容級別設置為 90 或 更高

      3.查看我的數據庫版本及兼容級別

      如果不知道怎么看數據庫版本或兼容級別的話可以在SQL Server Management Studio新建一個查詢窗口輸入
      print @@version
      運行之后在我的本機上得到

      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)
          Apr  2 2010 15:53:02
          Copyright (c) Microsoft Corporation
          Express Edition with Advanced Services on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
      然后我們選擇一個數據庫然后右鍵-屬性 選擇[選項]得到下圖的信息
      image 
      在確認數據庫的版本和兼容級別符合1,2點的要求后你才可以接著繼續往下學習

      II:使用 PIVOT 實現數據表的行轉列

      1.在這里我們先構建一個測試數據表(這里使用的是臨時表,以方便我們在退出會話的時候自動刪除表及其數據)

      首先我們先設計一個表架構為 #Student { 學生編號[PK],  姓名, 性別, 所屬班級 } 的表,然后編寫如下T-SQL

      --創建臨時表(僅演示,表結構的不合理還請包涵)
      CREATETABLE #Student (
      [學生編號]INTIDENTITY(1, 1) PRIMARYKEY,
      [姓名]NVARCHAR(20),
      [性別]NVARCHAR(1),
      [所屬班級]NVARCHAR(20)
      );

      --給臨時表插入數據
      INSERTINTO #Student (
      [姓名], [性別], [所屬班級]
      )
      SELECT'李妹妹', '', '初一 1班'UNIONALL
      SELECT'泰強', '', '初一 1班'UNIONALL
      SELECT'泰映', '', '初一 1班'UNIONALL
      SELECT'何謝', '', '初一 1班'UNIONALL
      SELECT'李春', '', '初二 1班'UNIONALL
      SELECT'吳歌', '', '初二 1班'UNIONALL
      SELECT'林純', '', '初二 1班'UNIONALL
      SELECT'徐葉', '', '初二 1班'UNIONALL
      SELECT'龍門', '', '初三 1班'UNIONALL
      SELECT'小紅', '', '初三 1班'UNIONALL
      SELECT'小李', '', '初三 1班'UNIONALL
      SELECT'小黃', '', '初三 2班'UNIONALL
      SELECT'旺財', '', '初三 2班'UNIONALL
      SELECT'強強', '', '初二 1班';

       

      以下是查詢的結果

      學生編號 姓名 性別 所屬班級
      1 李妹妹 初一 1班
      2 泰強 初一 1班
      3 泰映 初一 1班
      4 何謝 初一 1班
      5 李春 初二 1班
      6 吳歌 初二 1班
      7 林純 初二 1班
      8 徐葉 初二 1班
      9 龍門 初三 1班
      10 小紅 初三 1班
      11 小李 初三 1班
      12 小黃 初三 2班
      13 旺財 初三 2班
      14 強強 初二 1班

      2.查詢各班級的總人數

      SELECT 
      [所屬班級]AS[班級],
      COUNT(1) AS[人數]
      FROM #Student
      GROUPBY[所屬班級]
      ORDERBY[人數]DESC

       

      班級 人數
      初二 1班 5
      初一 1班 4
      初三 1班 3
      初三 2班 2

      好了,在這里我希望把上面的 表 { 班級, 人數 } 由 班級[行] 的顯示轉換為 班級[列] 的顯示格式!

      在此你會看到第一個PIVOT示例~_~

      是否很期待??

      3.編寫第一個PIVOT示例

      SELECT 
      '班級總人數:'AS[總人數],
      [初一 1班], [初一 2班],
      [初二 1班],
      [初三 1班], [初三 2班]
      FROM (
      SELECT
      [所屬班級]AS[班級],
      [學生編號]
      FROM #Student
      )
      AS[SourceTable]
      PIVOT (
      COUNT([學生編號])
      FOR[班級]IN (
      [初一 1班], [初一 2班],
      [初二 1班],
      [初三 1班], [初三 2班]
      )
      )
      AS[PivotTable]

      image

      在結果表中我們看到了對于不存在的班級 初一 2班 它的總人數為0, 這符合我們預期的結果!

      解釋:使用POVIT首先你需要在FROM子句內定義2個表

      A.一個稱為源表(SourceTable)

      B.另一個稱為數據透視表(PivotTable)

      語法
      SELECT
      
          <未透視的列>,
      
          [第一個透視列] AS <列別名>,
      
          [第二個透視列] AS <列別名>,
      
          ...
      
          [最后一個透視列] AS <列別名>
      
      FROM (
      
          <SELECT查詢>
      
      ) AS <源表>
      
      PIVOT (
      
          <聚合函數>(<列>)
      
          FOR [<需要轉換為行的列>] IN (
      
              [第一個透視列], [第二個透視列],
      
              ...
      
             [最后一個透視列]
      
          )
      
      ) AS <數據透視表>
      
      <可選的ORDER BY子句>;
      

      以上的PIVOT子句內的第1…n個透視列的值均為 需要轉換為行的列 的常量值,需要用[]括起,支持GUID,字符串及各種數字!
      具體Technet地址為: http://technet.microsoft.com/zh-cn/library/ms177410(SQL.100).aspx

      4.下面演示一個較為高級的行轉列的應用示例

      --使用 PIVOT 查詢班級內的男女學生人數及總人數
      SELECT
      [所屬班級]AS[班級],
      []AS[男生人數],
      []AS[女生人數],
      []+[]AS[總人數]
      FROM (
      SELECT[學生編號], [所屬班級], [性別]FROM #Student
      )
      AS[SourceTable]
      PIVOT (
      COUNT([學生編號])
      FOR[性別]IN (
      [], []
      )
      )
      AS[PivotTable]
      ORDERBY[總人數]DESC

      image

      III:使用 UNPIVOT 實現的功能其實與PIVOT恰恰相反

      1.語法同PIVOT.但是UNPIVOT的子句沒有聚合函數

      SELECT
      
          <未逆透視的列>,
      
          [合并后的列] AS <列別名>,
      
          [行值的列名] AS <列別名>
      
      FROM (
      
          <SELECT查詢>
      
      ) AS <源表>
      
      UNPIVOT (
      
          <行值的列名>
      
          FOR <將原來多個列合并到單個列的列名> IN (
      
              [第一個合并列], [第二個合并列],
      
              ...
      
             [最后一個合并列]
      
          )
      
      ) AS <數據逆透視表>
      
      <可選的ORDER BY子句>;
      

      2.看上面的語法感覺很浮云,不怕,這里帶例子(繼續使用II中用到的PIVOT表)

      --源表

      SELECT
      '班級總人數:'AS[總人數],
      [初一 1班], [初一 2班],
      [初二 1班],
      [初三 1班], [初三 2班]
      INTO #PivotTable --為了使表達意圖更清晰,我把PIVOT處理后的表放到一個臨時表當中
      FROM (
      SELECT
      [所屬班級]AS[班級],
      [學生編號]
      FROM #Student
      )
      AS[SourceTable]
      PIVOT (
      COUNT([學生編號])
      FOR[班級]IN (
      [初一 1班], [初一 2班],
      [初二 1班],
      [初三 1班], [初三 2班]
      )
      )
      AS[PivotTable]

      image
      將多個列合并到單個列的轉換的語句!!!

      --結果
      SELECT
      [班級], [總人數]
      FROM (
      SELECT
      [初一 1班], [初一 2班],
      [初二 1班],
      [初三 1班], [初三 2班]
      FROM
      #PivotTable
      )
      AS[s]
      UNPIVOT (
      [總人數]
      FOR[班級]IN (
      [初一 1班], [初一 2班],
      [初二 1班],
      [初三 1班], [初三 2班]
      )
      )
      AS[un_p]

      image
      在這里也寫個比較高級的希望各位DBA莫笑!
      覺得好的請[推薦]一下下,本人時間有限,未能逐一回復,請見晾!首先謝謝各位看過本文的朋友!

      SELECT 
      [所屬班級]AS[班級],
      []AS[男生人數],
      []AS[女生人數],
      []+[]AS[總人數]
      INTO #PivotTable2 --放到臨時表方便查詢
      FROM (
      SELECT[學生編號], [所屬班級], [性別]FROM #Student
      )
      AS[SourceTable]
      PIVOT (
      COUNT([學生編號])
      FOR[性別]IN (
      [], []
      )
      )
      AS[PivotTable]
      ORDERBY[總人數]DESC



      SELECT
      [班級],
      [男生或女生人數],
      [性別],
      [總人數]
      FROM (
      SELECT[班級], [男生人數], [女生人數], [總人數]FROM #PivotTable2
      )
      AS[s]
      UNPIVOT (
      [男生或女生人數]
      FOR[性別]IN (
      [男生人數],
      [女生人數]
      )
      )
      AS[un_p]

      image

      或者將 性別 和 人數合并到一個列當中:

      SELECT 
      [班級],
      [性別]+': '+CAST([男生或女生人數]ASNVARCHAR(1)) AS[男生或女生人數],
      [總人數]
      FROM (
      SELECT[班級], [男生人數], [女生人數], [總人數]FROM #PivotTable2
      )
      AS[s]
      UNPIVOT (
      [男生或女生人數]
      FOR[性別]IN (
      [男生人數],
      [女生人數]
      )
      )
      AS[un_p]

      image

      IV:網友提問解答

      就在2012-08-07突然收到一個園友的短消息問問題,正好今天上午思路一變有了答案就答復了他!

      他的問題是這樣的把

      IdSNameCourse1Course2Course3
      1 張三 80 60 70
      2 李四 60 70 57
      3 王五 85 87 94

      變成下表

      Course張三李四王五
      Course1 80 60 85
      Course2 60 70 87
      Course3 70 57 94

      以下是我簡陋的代碼回復...

      select 1 as Id, N'張三' as SName, 80 as Course1, 60 as Course2, 70 as Course3 union all
      select 2, N'李四', 60, 70, 57 union all
      select 3, N'王五', 85, 87, 94
      
      ;with cte1 as (
          select 1 as Id, N'張三' as SName, 80 as Course1, 60 as Course2, 70 as Course3 union all
          select 2, N'李四', 60, 70, 57 union all
          select 3, N'王五', 85, 87, 94
      ), 
      cte2 as (
          select SName, Course1 as fs, N'Course1' as Course from cte1 union all
          select SName, Course2, N'Course2' from cte1 union all
          select SName, Course3, N'Course3' from cte1
      )
      select
          Course, [張三], [李四], [王五]
      from (
          select * from cte2 group by Course, SName, fs
      ) src
      pivot (
          max(fs)
          for SName in (
              [張三], [李四], [王五]
          )
      ) piv
      

      本文已結束!!

      posted @ 2011-07-15 07:30  dotNetDR_  閱讀(4101)  評論(16)    收藏  舉報
      主站蜘蛛池模板: 国产福利姬喷水福利在线观看| 天堂在线精品亚洲综合网| 人人澡人摸人人添| 无码人妻精品一区二区三| 国产精品七七在线播放| 国产午夜福利一区二区三区| 午夜色无码大片在线观看免费| 乌克兰丰满女人a级毛片右手影院| 日韩一区二区三区无码a片| 国产一区二区精品久久岳| 国产福利酱国产一区二区| 国产在线午夜不卡精品影院| 亚洲一区二区三区丝袜| 亚洲色大成成人网站久久| 久久精品无码精品免费专区| 九九热视频在线观看精品| 宅男噜噜噜66在线观看| 欧美成人h精品网站| 大香伊蕉在人线国产最新2005| 麻豆久久久9性大片| 国产初高中生视频在线观看| 玩弄放荡人妻少妇系列 | 久久一日本综合色鬼综合色| 丰满人妻一区二区三区色| 国内精品无码一区二区三区 | 国产一区二区三区av在线无码观看| 国产亚洲欧洲AⅤ综合一区| 亚洲精品成人福利网站| 午夜无码免费福利视频网址| 日本中文一二区有码在线| 亚洲国产精品综合久久2007| 国产人与zoxxxx另类| 九九久久人妻一区精品色| 国产精品大全中文字幕| 欧美va天堂在线电影| 国产精品自拍视频第一页| 国产精品小一区二区三区| 亚洲AV无码破坏版在线观看| 午夜精品区| 九九热免费在线播放视频| 思思久99久女女精品|