由簡到難生成資料庫報表(三)

2021-06-06 04:22:03 字數 3577 閱讀 3079

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

要求按照主鍵排序,檢索所有制單人不為空的銷售單,並且為每行顯示乙個行號。 

在mssqlserver、 oracle、 db2等支援視窗函式的dbms中, 使用視窗函式row_number()

可以完成這個功能: 

對於mysql以及mssqlserver2000等不支援視窗函式的dbms函式可以使用子查詢來完成

這個功能: 

由於是按照fid排序, 而且fid的值是唯一的,所以使用相關子查詢計算小於等於當前fid

值的行的個數就可以得到當前行的行號。 執行完畢我們就能在輸出結果中看到上面的執行結

果要求將每張銷售單中銷售量最大的明細記錄標記出來。 

嘗試使用下面的sql語句來來完成要求的功能:

select fid,fbillid,fmerchandiseid,fcount, 

case  

when fcount=max(fcount) 

then '單內最大值' 

else ''  

end 

from t_salebilldetail 

group by fbillid 

在這個 sql 語句中,首先按照 fbillid 進行分組,然後使用聚合函式 max()來計算組內

fcount的最大值,最後使用case函式判斷每一行的fcount是否等於這個最大值。 

執行這個sql語句後dbms會報出如下的錯誤資訊: 

選擇列表中的列  't_salebilldetail.fid' 無效,因為該列沒有包含在聚合函式或  group by 子句中。 

出現這個錯誤的原因是因為出現在 select 列表中的所有列如果不是在聚合函式中使用則必須加入 group  by 子

句中。為了保證這個 sql 語句能夠正確執行,需要將用到的所有列放到group by子句中,sql 語句如下:

select fid,fbillid,fmerchandiseid,fcount,

case

when fcount=max(fcount)

then '單內最大銷售量'

雖然 sql 語句能夠執行通過了,不過非常遺憾的是,這個執行結果是錯誤的,因為將

select列表中的所有列都放到group by 子句中會破壞原有的分組。這裡將講解使用聚

合函式而又不必將select列表中的所有列都放到group by 子句中的技巧。 

在介紹視窗函式的時候曾經提到,使用視窗函式將無需使用 group by 子句,而且窗

口函式中的聚合計算不會影響其他的列,因此對於支援視窗函式的 dbms 可以使用如下的

sql語句: 

select fid,fbillid,fmerchandiseid,fcount,

case

when fcount=max(fcount) over(partition by fbillid)

then '單內最大銷售量'

這裡使用視窗函式「max(fcount) over(partition by fbillid)」計算每一行所屬

的銷售單中的銷售量的最大值,然後將其與 fcount 進行比較,如果等於 fcount 則表示當前

行是銷售量的最大值所在的行。 

執行完畢我們就能在輸出結果中看到上面的執行結果: 

對於 mysql、mssqlserver2000 等不支援視窗函式的 dbms 來說,可以使用相關子

查詢來達到相同的效果。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 '單內銷售量最大'

這裡使用相關子查詢來計算每乙個銷售單中的銷售量的最大值,其餘部分與使用視窗函式

是一樣的。需要注意的是相關子查詢中的 where 子句中將 t1.fbillid和 t2.fbillid進行

了相等性過濾,這樣就達到了視窗函式中「partition  by  fbillid」一樣的分割槽計算最大值

的效果,因此這個where語句是不能遺漏的。 

這個案例是非常典型的,當需要使用聚合計算,但是又不希望由於引入聚合函式而需要添

加額外的 group by 子句的話可以使用這裡介紹的方案,那就是:支援視窗函式的 dbms 使用

視窗函式,不支援視窗函式的dbms使用子查詢。 

總結:到目前為止,這個案例就基本上講解完畢了。還有一些比較常用的功能就是關於日期、排序等

方面功能,大家可以了解一下這方面的函式!

我看過,現在網上流傳什麼sql手冊,我們要查的很多東西,這個手冊都不能滿足,

所以,我建議我們應該多去官網,看相應的函式介紹及幫助。

自動生成資料庫字典

1.首先需要填寫表的每一列的說明 2.建立試圖 go object view dbo sura view dbdictionary script date 05 31 2013 17 19 19 set ansi nulls on goset quoted identifier on gocreat...

sessionFactory 生成資料庫表

tomcat 啟動時會讀取web.xml檔案 根據其中的配置 contextconfiglocation org.springframework.web.context.contextloaderlistener 1.首先讀取.中的配置資訊,建立contextloaderlistener 的例項物件...

使用PowerDesigner生成資料庫測試資料

方法如下 a 在powerdesigner 建表 b 然後給每乙個表的字段建立相應的摘要檔案 步驟如下 model test data profiles配置每乙個字段摘要檔案general 輸入name code 選擇class 數字 字元 時間 型別 選擇generation source aut...