亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)

系統(tǒng) 2787 0

本文是此案例的收尾工作,再介紹一些零散的東西,也是比較常用的知識(shí)!

為查詢編號(hào)

要求按照主鍵排序,檢索所有制單人不為空的銷售單,并且為每行顯示一個(gè)行號(hào)。
在MSSQLServer、 Oracle、 DB2等支持窗口函數(shù)的DBMS中, 使用窗口函數(shù)ROW_NUMBER()
可以完成這個(gè)功能:
      select row_number() over(order by fid) as rn,fnumber,FMakeDate
from T_SaleBill
where FMakeDate is not null
    

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)
對(duì)于MYSQL以及MSSQLServer2000等不支持窗口函數(shù)的DBMS函數(shù)可以使用子查詢來完成
這個(gè)功能:
      SELECT  
( 
  SELECT COUNT(*) FROM T_SaleBill t1 
  WHERE t1.FId<=t2.FId  
   AND t1.FBillMakerId IS NOT NULL 
) AS rn, 
t2.FNumber,t2.FMakeDate 
FROM T_SaleBill t2 
WHERE t2.FBillMakerId IS NOT NULL 
ORDER BY t2.FId 
    

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)
由于是按照FId排序, 而且FId的值是唯一的,所以使用相關(guān)子查詢計(jì)算小于等于當(dāng)前FId
值的行的個(gè)數(shù)就可以得到當(dāng)前行的行號(hào)。 執(zhí)行完畢我們就能在輸出結(jié)果中看到上面的執(zhí)行結(jié)

標(biāo)記所有單內(nèi)的最大銷售量

要求將每張銷售單中銷售量最大的明細(xì)記錄標(biāo)記出來。
嘗試使用下面的SQL語句來來完成要求的功能:


sELECT FId,FBillId,FMerchandiseId,FCount,
CASE
WHEN FCount=MAX(FCount)
THEN '單內(nèi)最大值'
ELSE ''
END
FROM T_SaleBillDetail
GROUP BY FBillId

在這個(gè) SQL 語句中,首先按照 FBillId 進(jìn)行分組,然后使用聚合函數(shù) MAX()來計(jì)算組內(nèi)
FCount的最大值,最后使用CASE函數(shù)判斷每一行的FCount是否等于這個(gè)最大值。
執(zhí)行這個(gè)SQL語句后DBMS會(huì)報(bào)出如下的錯(cuò)誤信息:
選擇列表中的列 'T_SaleBillDetail.FId' 無效,因?yàn)樵摿袥]有包含在聚合函數(shù)或 GROUP BY 子句中。
出現(xiàn)這個(gè)錯(cuò)誤的原因是因?yàn)槌霈F(xiàn)在 SELECT 列表中的所有列如果不是在聚合函數(shù)中使用則必須加入 GROUP BY 子
句中。為了保證這個(gè) SQL 語句能夠正確運(yùn)行,需要將用到的所有列放到GROUP BY子句中,SQL 語句如下:
      select fid,fBillId,FMerchandiseId,Fcount,
case
	when fcount=max(fcount)
	then '單內(nèi)最大銷售量'
	else ''
end
from t_SaleBillDetail
group by fBillId,fid,FMerchandiseId,Fcount
    

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)

雖然 SQL 語句能夠執(zhí)行通過了,不過非常遺憾的是,這個(gè)執(zhí)行結(jié)果是錯(cuò)誤的,因?yàn)閷?
SELECT列表中的所有列都放到GROUP BY 子句中會(huì)破壞原有的分組。這里將講解使用聚
合函數(shù)而又不必將SELECT列表中的所有列都放到GROUP BY 子句中的技巧。
在介紹窗口函數(shù)的時(shí)候曾經(jīng)提到,使用窗口函數(shù)將無需使用 GROUP BY 子句,而且窗
口函數(shù)中的聚合計(jì)算不會(huì)影響其他的列,因此對(duì)于支持窗口函數(shù)的 DBMS 可以使用如下的
SQL語句:

    select fid,fBillId,FMerchandiseId,Fcount,
case
	when fcount=max(fcount) over(partition by fbillId)
	then '單內(nèi)最大銷售量'
	else ''
end
from t_SaleBillDetail
group by fBillId,fid,FMerchandiseId,Fcount
  

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)

這里使用窗口函數(shù)“MAX(FCount) OVER(PARTITION BY FBillId)”計(jì)算每一行所屬
的銷售單中的銷售量的最大值,然后將其與 FCount 進(jìn)行比較,如果等于 FCount 則表示當(dāng)前
行是銷售量的最大值所在的行。
執(zhí)行完畢我們就能在輸出結(jié)果中看到上面的執(zhí)行結(jié)果:


對(duì)于 MYSQL、MSSQLServer2000 等不支持窗口函數(shù)的 DBMS 來說,可以使用相關(guān)子

查詢來達(dá)到相同的效果。SQL語句如下:

    select t1.fid,t1.fBillId,t1.FMerchandiseId,t1.fCount,
case
	when fcount=
	(
		select max(Fcount) from T_SaleBillDetail t2
		where t2.fBillId=t1.fBillId
	)
	then '單內(nèi)銷售量最大'
	else ''
end 
from T_SaleBillDetail t1
  

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)

這里使用相關(guān)子查詢來計(jì)算每一個(gè)銷售單中的銷售量的最大值,其余部分與使用窗口函數(shù)
是一樣的。需要注意的是相關(guān)子查詢中的 WHERE 子句中將 t1.FBillId和 t2.FBillId進(jìn)行
了相等性過濾,這樣就達(dá)到了窗口函數(shù)中“PARTITION BY FBillId”一樣的分區(qū)計(jì)算最大值
的效果,因此這個(gè)WHERE語句是不能遺漏的。
這個(gè)案例是非常典型的,當(dāng)需要使用聚合計(jì)算,但是又不希望由于引入聚合函數(shù)而需要添
加額外的 GROUP BY 子句的話可以使用這里介紹的方案,那就是:支持窗口函數(shù)的 DBMS 使用
窗口函數(shù),不支持窗口函數(shù)的DBMS使用子查詢。



總結(jié):到目前為止,這個(gè)案例就基本上講解完畢了。還有一些比較常用的功能就是關(guān)于日期、排序等

方面功能,大家可以了解一下這方面的函數(shù)!

我看過,現(xiàn)在網(wǎng)上流傳什么SQL手冊(cè),我們要查的很多東西,這個(gè)手冊(cè)都不能滿足,

所以,我建議我們應(yīng)該多去官網(wǎng),看相應(yīng)的函數(shù)介紹及幫助。

http://msdn.microsoft.com/en-us/sqlserver/default

由簡(jiǎn)到難生成數(shù)據(jù)庫(kù)報(bào)表(三)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产成人久久久精品一区二区三区 | 精品国产品香蕉在线观看75 | 另类综合视频 | 久久成人国产 | 极品俄罗斯性孕妇孕交 | 成年女人毛片免费观看中文w | 深夜精品影院18以下勿进 | 亚洲桃色视频 | 国产精品久久久久久久 | 美女粉逼 | 波多野结衣免费免费视频一区 | 成人高清视频在线观看大全 | 亚洲成人免费网站 | 欧美黄网站 | 福利社91| 色综合a怡红院怡红院首页 色综合h | 97神马| 美女羞羞视频网站 | 波多野结衣一区二区三区 | 亚洲人成网站色7799在线观看 | 天天做天天爱天天影视综合 | 久久久久久久久久免费视频 | 国产香蕉98碰碰久久人人 | 在线不卡一区 | 国产精品久久久久尤物 | 国产精品精品 | 亚洲在线免费视频 | 牛牛影视在线观看片免费 | 国产精品一区二区免费 | 青青青青爽视频在线播放 | 91成人午夜精品福利院在线观看 | 在线日韩不卡 | 国内精品久久久久久久星辰影视 | 亚洲欧美中文字幕专区 | 久久久久久久久免费视频 | 99久久免费精品视频 | 一区二区三区中文 | 久久99精品久久久久久首页 | 久久99精品一久久久久久 | 亚洲激情网站 | 99精彩视频 |