日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
用一些不常見的SQL語句實(shí)現(xiàn)讓人意想不到的功能

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

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的濮陽縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1.  假設(shè)我想把Person.Contact表中所有人的名字用逗號(hào)連接起來,串成一個(gè)字符串,可能會(huì)想到使用游標(biāo)把FirstName查出來然后逐行賦值給一個(gè)字符串變量,可是使用游標(biāo)的代價(jià)是很大的??纯聪旅娴拇a:

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

查詢得到的結(jié)果是(用的是AdventureWorks數(shù)據(jù)庫(kù)中的Contact表):

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

使用其他的語句是不能達(dá)到這個(gè)效果的,不過我沒有深入考慮過,但是這個(gè)是很簡(jiǎn)單的語句。

還有一個(gè)地方和這個(gè)類似,就是在行列轉(zhuǎn)換的時(shí)候拼接動(dòng)態(tài)sql語句,首先使用下面的語句創(chuàng)建一個(gè)臨時(shí)表:

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

表中的數(shù)據(jù)如下:

圖1

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

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

查詢結(jié)果如下:

圖2

說這種方法笨是因?yàn)樾枰孪戎啦牧系念悇e,如果有很多種材料這個(gè)語句就會(huì)很長(zhǎng)了,下面我們使用動(dòng)態(tài)語句來實(shí)現(xiàn)這個(gè)功能:

 
 
 
 
  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字符串變量到底長(zhǎng)得什么樣子,使用print @sql將它打印出來:

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

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

2.寫一個(gè)語句獲得當(dāng)前這個(gè)月有多少天

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

 
 
 
 
  1. select 
  2. datepart(
  3. dd,--datepart的參數(shù)取本月最后一天的天數(shù),即為本月的天數(shù)
  4. dateadd(dd,--取下個(gè)月的第一天的前一天,就是本月最后一天
  5. -1,
  6. dateadd(mm,--取下一個(gè)月的第一天
  7. 1,
  8. cast(cast(year(getdate())as varchar)+'-'+ --取當(dāng)前的年
  9. cast(month(getdate()) as varchar)+'-01'--取這個(gè)月的第一天
  10. as datetime))) --轉(zhuǎn)換成時(shí)間
  11. )

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

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

 
 
 
 
  1. select so.UnitPrice, NewUnitPrice = 
  2. case when so.UnitPrice is null then 'unknown' --NewPrice一點(diǎn)類似于C#里面的var變量,事先不定義類型,從賦值結(jié)果里面確認(rèn)它的類型
  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)) --這里一定要轉(zhuǎn)換成字符串
  7. end
  8. from Sales.SalesOrderDetail so order by UnitPrice

要注意的是最后剩下一些不做歸類轉(zhuǎn)換的必須將類型轉(zhuǎn)換為varchar,否則會(huì)有語法錯(cuò)誤。結(jié)果如下:

圖3

4.假設(shè)有一張聯(lián)系人姓名表,現(xiàn)在想查出這個(gè)表中姓相同的聯(lián)系人的數(shù)目,猛一看有點(diǎn)懵,其實(shí)很簡(jiǎn)單,來看代碼:

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

圖4

注意要統(tǒng)計(jì)那個(gè)字段就要對(duì)那個(gè)字段進(jìn)行聚合操作,如圖我們可以看到有77個(gè)姓Davis的,71個(gè)姓Lin的,90個(gè)姓Waston的等等。

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


網(wǎng)站題目:用一些不常見的SQL語句實(shí)現(xiàn)讓人意想不到的功能
URL分享:http://www.dlmjj.cn/article/djegjoc.html