成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL行轉列應用的動態實現方式

數據庫 SQL Server
SQL行轉列的需求,在項目中還是經常可見的,尤其報表類的應用,更是非常廣泛!上期我們講了SQL行轉列的靜態實現方式,本期搞一下行轉列的動態實現方案,解決方案并不唯一,這里采用存儲過程的實現方式!

概述:

SQL行轉列的需求,在項目中還是經常可見的,尤其報表類的應用,更是非常廣泛!上期我們講了SQL行轉列的靜態實現方式,本期搞一下行轉列的動態實現方案,解決方案并不唯一,這里采用存儲過程的實現方式!

 

[[440882]]

 

接下來我們詳細講解下SQL動態行轉列的實現步驟:

創建模擬數據:

這里還是老套路,IT編程人入門的經典學生選課表系列,學生表、課程表、成績表!就拿這套耳熟能詳的表結構進行講解!

 

SQL行轉列應用的動態實現方式

 

 

SQL行轉列應用的動態實現方式

 

插入模擬的數據,用于動態行轉案例的使用!

 

SQL行轉列應用的動態實現方式

 

先寫好靜態行轉列SQL:

這一步相對還是比較重要,畢竟我們要在一個靜態的行轉列基礎之上,構建動態的行轉列應用,課程數據會有動態變化,學生也會選擇新開的課程,這樣靜態模式勢必不會有效,但參照靜態模板,去開發動態的模式,則更加有參照性!

 

  1. SELECT S.SID,S.sname,  
  2. MAX(case c.cname when '數學' then sc.score else 0 endas 數學, 
  3. MAX(case c.cname when '語文' then sc.score else 0 endas 語文, 
  4. MAX(case c.cname when '英語' then sc.score else 0 endas 英語 
  5. FROM Student as S 
  6. LEFT JOIN SC AS SC ON S.sid = SC.SID 
  7. LEFT JOIN Course AS C ON C.cid = SC.CID 
  8. GROUP BY S.sid,S.sname 

 

 

SQL行轉列應用的動態實現方式

 

通過測試,數據效果沒有問題,正是我們期待的樣子!

編寫動態腳本:

動態行轉列無疑需要使用SQL編程的技術,動態的遞歸課程名稱,這樣才可以一勞永逸的解決問題!

先編寫動態的SQL腳本:

 

  1. DECLARE @SQL VARCHAR(MAX
  2.  
  3. SELECT @SQL = ' SELECT S.SID,S.SNAME ' 
  4. SELECT @SQL = @SQL + ' , ISNULL(MAX(CASE c.cname WHEN '''+cname+''' THEN sc.score END ),0) AS '''+c.cname+''' '  
  5. FROM Course  AS C 
  6.  
  7. print @sql 
  8.  
  9. SELECT @SQL = @SQL + ' FROM Student as S 
  10. LEFT JOIN SC AS SC ON S.sid = SC.SID 
  11. LEFT JOIN Course AS C ON C.cid = SC.CID  
  12. GROUP BY S.sid,S.sname' 
  13.  
  14. print @sql 
  15.  
  16. EXEC (@SQL) 

 

測試結果與靜態SQL完全一致,看來問題已經解決,接下來就是優化的問題了!

 

 

將上述的動態腳本封裝成存儲過程,第一可以盡量地提升查詢效率,第二方便代碼段的調用!

 

  1. CREATE PROC StudentScore_Proc 
  2. AS 
  3. BEGIN 
  4.  
  5.  
  6. DECLARE @SQL NVARCHAR(MAX
  7.  
  8. SELECT @SQL = N' SELECT S.SID,S.SNAME ' 
  9. SELECT @SQL = @SQL + N' , ISNULL(MAX(CASE c.cname WHEN '''+cname+''' THEN sc.score END ),0) AS '''+c.cname+''' '  
  10. FROM Course  AS C 
  11.  
  12.  
  13. SELECT @SQL = @SQL + N' FROM Student as S 
  14. LEFT JOIN SC AS SC ON S.sid = SC.SID 
  15. LEFT JOIN Course AS C ON C.cid = SC.CID  
  16. GROUP BY S.sid,S.sname' 
  17.  
  18. print @sql 
  19.  
  20. EXECUTE sp_executesql 
  21. @STMT = @SQL 
  22.  
  23. END 
  24.  
  25. EXEC dbo.StudentScore_Proc 

 

封裝完存儲過程,我們再執行一下,看看結果!果然沒有任何問題,與預期完全一致!

 

 

這時候我們更改一下數據,課程表中新增物理、化學兩門課程,諾克薩斯之手分別選擇了兩門課程,蓋倫僅僅選擇了化學,武器大師逃學,倆門課都沒有選擇。

 

  1. INSERT INTO Course SELECT 4,'物理' 
  2. INSERT INTO Course SELECT 5,'化學' 
  3.  
  4. INSERT INTO SC SELECT 1,4,99 
  5. INSERT INTO SC SELECT 1,5,88 
  6. INSERT INTO SC SELECT 2,5,77 
  7.  
  8. EXEC dbo.StudentScore_Proc 

 

數據改變之后,我們繼續測試一下,再次執行我們編寫好的存儲過程,結果非常完美,隨著數據的變化,查詢的結果集也是對應的變化,非常NICE,大功告成了!

 

 

總結一下:

 

連續倆篇的文章更新,SQL行轉列在項目中的應用都已經涵蓋了。即將步入年底了,肯定有很多小伙伴被客戶、領導追著搞各種報表,希望對小伙伴們有些許的幫助。

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2024-10-16 21:17:59

2021-06-23 10:13:00

SQL行轉列列轉行

2021-11-08 23:08:06

SQL Serve數據庫開發

2014-07-10 10:09:11

JSON數據行轉列

2021-10-14 06:51:55

數據庫SQL

2010-07-28 09:09:55

SQL

2025-04-03 08:00:51

2010-11-03 14:28:15

DB2行轉列

2010-07-13 16:07:26

SQL Server行

2010-07-13 16:20:30

SQL Server數

2010-11-12 13:08:36

動態sql語句

2024-02-04 09:24:45

MyBatisSQL語句Spring

2011-04-07 14:04:28

SQL動態交叉表

2010-02-03 10:11:17

C++動態數組

2021-02-06 14:27:00

SQL優化運維

2009-09-14 13:17:51

LINQ to SQLLINQ to SQL

2010-11-12 11:48:15

2012-05-24 09:18:34

ibmdw

2010-07-22 09:01:02

SQL Server鏡

2009-05-28 09:48:21

微軟Windows 7操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产1区2区3区 | 欧美日韩综合 | 欧美韩一区二区 | 黄色免费在线观看网站 | 国产精品久久国产精品 | 午夜三区 | 国产精品免费av | 日本a在线 | 亚洲在线日韩 | 大陆一级毛片免费视频观看 | 天堂资源| 欧美精品1区2区 | 男人天堂午夜 | 国产无人区一区二区三区 | 伊人网在线播放 | 欧美亚洲一区二区三区 | 伊人伊人网 | 久久精品视频播放 | 久久久激情 | 亚洲激情综合 | 91精品国产综合久久久亚洲 | 日韩影音 | 精品视频一区二区 | 蜜臀久久99精品久久久久久宅男 | 午夜影院中文字幕 | 久久久久久久久久久久久久av | 中文字幕日本一区二区 | 亚洲一区中文字幕 | 欧美精品一区三区 | 情侣酒店偷拍一区二区在线播放 | 一级黄色毛片子 | 国产精品成人av | 夜夜艹天天干 | 欧美一区二区三区在线观看视频 | 精品国产乱码久久久久久88av | 国产欧美日韩一区二区三区在线 | 亚洲精品久久国产高清情趣图文 | 国产日韩精品在线 | 欧美久久一区二区 | 国产乱码久久久 | 欧美日日 |