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

SQL點滴之幾個有點偏的語句

數據庫 SQL Server
今天我們來討論一些不常見到的sql語句。這些語句不像普通的增刪查那樣平白,它的奇妙之處有時候讓人另眼相看。

SQL語句是一種集合操作,就是批量操作,它的速度要比其他的語言快,所以在設計的時候很多的邏輯都會放在sql語句或者存儲過程中來實現,這個是一種設計思想。但是今天我們來討論另外一個話題。Sql頁提供了豐富的函數供我們使用,還有很多操作有意想不到的結果,今天這個隨筆來看看一些不常見到的sql語句。這些語句不像普通的增刪查那樣平白,它的奇妙之處有時候讓人另眼相看。

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

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

查詢得到的結果是(用的是AdventureWorks數據庫中的Contact表):
Gustavo,Catherine,Kim,Humberto,Pilar,Frances,Margaret,Carla,Jay,Ronald,Samuel,James,
Robert,Fran? ois,Kim,Lili,Amy,Anna,Milton,Paul,Gregory,J.Phillip,
Michelle,Sean,Phyllis,Marvin,Michael,Cecil,Oscar,Sandra,Selena,Emilio,
Maxwell,Mae,Ramona,Sabria,Hannah,Kyley,Tom,Thomas,John,Chris,

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

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

  1. create table #DepartCost 
  2. id int
  3. Department varchar(20), 
  4. Material varchar(20), 
  5. Number int 
  6. insert into #DepartCost values 
  7. (1,'廠房','材料',1), 
  8. (1,'廠房','材料',2), 
  9. (1,'廠房','材料',1), 
  10. (1,'廠房','材料',1), 
  11. (1,'廠房','材料',1), 
  12. (1,'廠房','材料',1), 
  13. (1,'廠房','材料',2), 
  14. (1,'廠房','材料',1), 
  15. (1,'廠房','材料',1) 

表中的數據如下:

圖1

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

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

查詢結果如下:

圖2

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

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

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

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

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

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

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

  1. select  
  2. datepart( 
  3. dd,--datepart的參數取本月***一天的天數,即為本月的天數 
  4. dateadd(dd,--取下個月的***天的前一天,就是本月***一天 
  5.         -1, 
  6.         dateadd(mm,--取下一個月的***天 
  7.                 1, 
  8.                 cast(cast(year(getdate())as varchar)+'-'--取當前的年 
  9.                 cast(month(getdate()) as varchar)+'-01'--取這個月的***天 
  10.                 as datetime))) --轉換成時間 

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

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

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

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

圖3

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

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

圖4

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

原文鏈接:http://www.cnblogs.com/tylerdonet/archive/2011/08/01/2124046.html

【編輯推薦】

  1. 淺述遠程Service Broker的實現
  2. Service Broker基礎應用(下)
  3. Service Broker基礎應用(上)
  4. 簡述Service Broker事件通知功能

 

 

責任編輯:艾婧 來源: Tyler‘s DotNet
相關推薦

2011-09-09 10:10:13

SQL數據庫點滴

2011-04-27 16:34:06

withSQL Server

2011-04-20 11:11:33

SQLSET QUOTED_

2011-04-28 09:49:56

SQLwith子查詢

2011-06-23 14:00:51

SQL點滴

2011-10-09 16:40:50

T-SQL

2011-04-21 10:06:40

SQL篩選

2011-05-11 09:49:32

線程等待SQL Server

2011-09-13 10:25:05

數據庫點滴

2011-04-27 16:09:48

SQL ServerSSIS

2011-04-27 14:27:11

SQL Server

2011-08-03 13:32:00

SQL Server優化

2011-04-22 15:00:22

SQLwin7登錄

2011-04-21 13:49:29

dementionSQL

2011-05-06 16:36:48

SQL備份還原

2018-11-05 14:54:18

MySQLSQL語句數據庫

2011-02-25 17:00:25

SQL閏年

2011-04-27 13:21:59

SQL Serverattach

2011-04-27 15:55:16

2011-03-21 15:39:31

LAMPPHPSQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品久久 | 精品免费国产视频 | 热久久久 | 欧美一区二区三区精品 | 日本精品视频在线观看 | 成人福利在线观看 | 日韩免费毛片 | 男女视频在线观看网站 | 精品视频在线免费观看 | 国产福利观看 | 国产精品国产精品国产专区不片 | 亚洲精品视频一区 | 久久综合欧美 | av片免费观看 | 久久久久久久久久久久91 | 瑞克和莫蒂第五季在线观看 | 精品综合久久 | 成人av片在线观看 | 久久国产精品-国产精品 | 国产午夜精品理论片a大结局 | 国产综合久久 | 男女性毛片| 亚洲免费视频网址 | 人人人人干 | 美女黄色在线观看 | 91精品国产高清久久久久久久久 | 在线中文视频 | 成人欧美一区二区三区白人 | 欧美日韩中文在线观看 | 天天干天天操天天看 | 六月色婷 | 日韩在线观看网站 | 日韩一区二区av | 国产精品一区在线 | 国产激情一区二区三区 | 午夜电影福利 | 亚洲一区二区三区四区av | 91天堂网| 91高清在线视频 | 色综合一区二区 | 国产精品一区久久久 |