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

用一些不常見的SQL語句實現讓人意想不到的功能

數據庫 SQL Server
本文主要介紹了用一些不常見的SQL語句實現一些我們意想不到的功能,并給出了詳細的代碼和圖例,希望能夠對您有所幫助。

在SQL Server數據庫中,我們平時使用SQL語句時,經常是一些常見的插入、刪除和查詢等操作,本文我們換一種方式,介紹一些SQL語句的另類功能,主要介紹了幾個使用一些不常見的SQL語句來實現一些功能的例子,這些功能使人眼前一亮,是我們意想不到的。接下來我們就開始一一介紹。

1.  假設我想把Person.Contact表中所有人的名字用逗號連接起來,串成一個字符串,可能會想到使用游標把FirstName查出來然后逐行賦值給一個字符串變量,可是使用游標的代價是很大的。看看下面的代碼:

  1. declare @names varchar(1000)=''—注意賦值為空字符串是必須的  
  2.  
  3. select @names=isnull(@names,'')+FirstName+',' from Person.Contact  
  4.  
  5. print @names 

查詢得到的結果是(用的是AdventureWorks數據庫中的Contact表):

  1. Gustavo,Catherine,Kim,Humberto,Pilar,Frances,Margaret,Carla,Jay,  
  2.  
  3. Ronald,Samuel,James,Robert,Fran?ois,Kim,Lili,Amy,Anna,Milton,Paul,  
  4.  
  5. Gregory,J.Phillip,Michelle,Sean,Phyllis,Marvin,Michael,Cecil,Oscar,Sandra,  
  6.  
  7. Selena,Emilio,Maxwell,Mae,Ramona,Sabria,Hannah,Kyley,Tom,Thomas,John,Chris, 

 

使用其他的語句是不能達到這個效果的,不過我沒有深入考慮過,但是這個是很簡單的語句。

還有一個地方和這個類似,就是在行列轉換的時候拼接動態sql語句,首先使用下面的語句創建一個臨時表:

  1. create table #DepartCost  
  2.  
  3. (  
  4.  
  5. id int,  
  6.  
  7. Department varchar(20),  
  8.  
  9. Material varchar(20),  
  10.  
  11. Number int  
  12.  
  13. )  
  14.  
  15. insert into #DepartCost values  
  16.  
  17. (1,'廠房','材料',1),  
  18.  
  19. (1,'廠房','材料',2),  
  20.  
  21. (1,'廠房','材料',1),  
  22.  
  23. (1,'廠房','材料',1),  
  24.  
  25. (1,'廠房','材料',1),  
  26.  
  27. (1,'廠房','材料',1),  
  28.  
  29. (1,'廠房','材料',2),  
  30.  
  31. (1,'廠房','材料',1),  
  32.  
  33. (1,'廠房','材料',1) 

表中的數據如下:

用一些不常見的SQL語句實現讓人意想不到的功能

圖1

我們看到每個廠房分別使用的材料數量,還是一個老問題,如果我們想知道針對每種材料,每個廠房耗費的材料數量是多少該怎么寫呢。有一種笨的方法,如下:

  1. select Department,  
  2.  
  3. sum(case Material when '材料1' then Number else 0 end) as [材料],  
  4.  
  5. sum(case Material when '材料2' then Number else 0 end) as [材料],  
  6.  
  7. sum(case Material when '材料3' then Number else 0 end) as [材料]  
  8.  
  9. from #DepartCost  
  10.  
  11. group by Department 

查詢結果如下:

用一些不常見的SQL語句實現讓人意想不到的功能

圖2

說這種方法笨是因為需要事先知道材料的類別,如果有很多種材料這個語句就會很長了,下面我們使用動態語句來實現這個功能:

  1. declare @sql varchar(1000)  
  2.  
  3. set @sql = 'select Department ' 
  4.  
  5. select @sql = @sql+', sum(case Material when '''+Material+''' then Number else 0 end) as ['+Material+']' from  
  6.  
  7. (select distinct Material from #DepartCost) as a  
  8.  
  9. select @sql = @sql + ' from #DepartCost group by Department '  
  10.  
  11. exec(@sql) 

我們來看看@sql字符串變量到底長得什么樣子,使用print @sql將它打印出來:

  1. select Department , sum(case Material when '材料' then Number else 0 end) as [材料],   
  2.  
  3. sum(case Material when '材料' then Number else 0 end) as [材料], sum(case Material when '材料' then Number else 0 end) as [材料]  
  4.  
  5.  from #DepartCost group by Department 

這個語句和上面那個是一樣的,當然exec(@sql)得到的結果也是一樣的了。這里我不知道這種特性有個什么說法,不像子查詢,也不是case語句。

2.寫一個語句獲得當前這個月有多少天

這個涉及到日期和時間,初步的思路是查詢得到本月的最后一天,然后用datepart獲得天數,這是一個很直接的方法。來看下面的語句:

  1. select   
  2.  
  3. datepart(  
  4.  
  5. dd,--datepart的參數取本月最后一天的天數,即為本月的天數  
  6.  
  7. dateadd(dd,--取下個月的第一天的前一天,就是本月最后一天  
  8.  
  9. -1,  
  10.  
  11. dateadd(mm,--取下一個月的第一天  
  12.  
  13. 1,  
  14.  
  15. cast(cast(year(getdate())as varchar)+'-'+ --取當前的年  
  16.  
  17. cast(month(getdate()) as varchar)+'-01'--取這個月的第一天  
  18.  
  19. as datetime))) --轉換成時間  
  20.  

這個語句沒有什么懸念,僅僅是時間函數的使用,只要知道這個思路就很容易寫出來。

3.假設我們有一張銷售表,現在要查出銷售單價,但是我們想不適用具體的價錢來顯示,而是顯示為一個范圍,比如價錢是1-100元要顯示“1 to 100”,100-200要顯示“100 to 200”,等等。來看代碼:

  1. select so.UnitPrice, NewUnitPrice =   
  2.  
  3. case when so.UnitPrice is null then 'unknown' --NewPrice一點類似于C#里面的var變量,事先不定義類型,從賦值結果里面確認它的類型  
  4.  
  5. when so.UnitPrice between 100 and 200 then '100 to 200'  
  6.  
  7. when so.UnitPrice between 201 and 300 then '200 to 300'  
  8.  
  9. when so.UnitPrice between 301 and 400 then '300 to 400'  
  10.  
  11. else cast(so.UnitPrice as varchar(10)) --這里一定要轉換成字符串  
  12.  
  13. end  
  14.  
  15. from Sales.SalesOrderDetail so order by UnitPrice 

要注意的是最后剩下一些不做歸類轉換的必須將類型轉換為varchar,否則會有語法錯誤。結果如下:

用一些不常見的SQL語句實現讓人意想不到的功能

圖3

4.假設有一張聯系人姓名表,現在想查出這個表中姓相同的聯系人的數目,猛一看有點懵,其實很簡單,來看代碼:

  1. select c.LastName,num_LastName=COUNT(1) from Person.Contact c group by c.LastName 

用一些不常見的SQL語句實現讓人意想不到的功能

圖4

注意要統計那個字段就要對那個字段進行聚合操作,如圖我們可以看到有77個姓Davis的,71個姓Lin的,90個姓Waston的等等。

關于用一些不常見的SQL語句實現我們意想不到的功能的介紹就到這里了,希望本次的介紹能夠帶給您一些收獲!

【編輯推薦】

  1. ASP.NET連接Oracle數據庫的步驟詳解
  2. MySQL數據庫各種存儲引擎及其作用簡介
  3. 介紹幾種大型的Oracle/SQL Server數據庫免費版
  4. SQL Server數據庫使用Insert語句實現數據的復制
  5. 如何通過擴展屬性為SQL Server的索引添加注釋信息
責任編輯:趙鵬 來源: 博客園
相關推薦

2017-01-20 13:37:40

大數據人工智能技術

2015-10-20 17:55:58

2017-06-01 16:20:08

MySQL復制延遲數據庫

2022-10-11 14:39:18

泄露數據數據安全

2015-08-05 17:16:03

OpenStackUnitedstack

2016-09-25 15:00:48

2022-08-02 15:04:36

JavaScript

2024-04-29 13:04:00

K8Spod驅逐

2010-09-07 11:28:15

SQL語句

2024-05-30 12:20:27

2011-07-05 11:24:52

SQL語句索引

2012-05-31 10:00:00

2014-08-07 10:19:43

Android系統應用領域

2022-03-22 07:38:00

SQL語句MySQL

2018-01-30 10:47:50

數據分析醫療保險數據科學

2012-04-26 14:34:22

HTML5

2020-08-25 13:22:07

數據可視化

2016-04-06 11:29:10

京東云基礎云數據云

2017-05-19 10:55:19

DRaaS提供商災難恢復

2011-04-12 09:12:06

程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频在线播放 | 99视频在线免费观看 | 久久久噜噜噜久久中文字幕色伊伊 | 在线观看视频91 | 人人爱干 | 午夜久久久| 美女爽到呻吟久久久久 | 亚洲精品久久久蜜桃 | 欧美区日韩区 | 呦呦在线视频 | av大片在线观看 | 日操操夜操操 | 久久综合av| 天堂亚洲网| 日韩伦理一区二区三区 | 国产欧美久久精品 | 91av在线免费观看 | 国产免费a视频 | 韩日精品在线观看 | 欧美视频区 | 日本在线精品视频 | 蜜桃传媒av| 国产1区| 国产一二三区精品视频 | 国产精品久久久久久吹潮日韩动画 | 91在线资源 | 91美女视频 | 日韩欧美一区二区三区在线播放 | 岛国午夜| 日本不卡高字幕在线2019 | 91精品久久久久久久久中文字幕 | 一级看片免费视频囗交动图 | av高清| 国产成人午夜电影网 | 亚洲天堂免费在线 | 综合国产| 精品一区二区三区在线观看国产 | 久久精品一 | av喷水 | 国产一区| 精品日韩一区二区 |