欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

由簡到難生成數據庫報表(三)

系統 2478 0

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

為查詢編號

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

由簡到難生成數據庫報表(三)
對于MYSQL以及MSSQLServer2000等不支持窗口函數的DBMS函數可以使用子查詢來完成
這個功能:
      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 
    

由簡到難生成數據庫報表(三)
由于是按照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 '單內最大銷售量'
	else ''
end
from t_SaleBillDetail
group by fBillId,fid,FMerchandiseId,Fcount
    

由簡到難生成數據庫報表(三)

雖然 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 '單內最大銷售量'
	else ''
end
from t_SaleBillDetail
group by fBillId,fid,FMerchandiseId,Fcount
  

由簡到難生成數據庫報表(三)

這里使用窗口函數“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 '單內銷售量最大'
	else ''
end 
from T_SaleBillDetail t1
  

由簡到難生成數據庫報表(三)

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



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

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

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

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

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

由簡到難生成數據庫報表(三)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 9久9久女女热精品视频免费观看 | 在线观看免费黄色小视频 | 久久久久亚洲 | 日韩欧美在线视频播放 | 亚洲成色www久久网站 | 草草影院w37 | 日本高清色视频在线观看免费 | 超级在线牛碰碰视频 | 天天干天天操天天碰 | 久久久成| 深夜福利一区二区 | 99国产欧美久久精品 | 91精品国产色综合久久不卡蜜臀 | 亚洲精品老司机综合影院 | 欧美日韩亚洲高清不卡一区二区三区 | 国产一级毛片视频 | 狠狠伊人 | 成年美女黄的视频网站 | 九九热免费观看 | 久久久9999久久精品小说 | 免费又粗又硬进去好爽A片视频 | 91色欧美| 女人被添全过程A片久久AV | 欧美激情综合色综合啪啪五月 | 欧美成人免费全网站大片 | 激情视频免费看 | 国产精品久久久久久久久久免费 | 亚洲美女一区二区三区 | 久操精品 | 亚洲日本视频在线 | 久草视频电影 | 欧美1区2区3区 | 亚洲免费在线播放 | 美女污污视频网站 | 97精品国产高清久久久久蜜芽 | 夜夜爱网站 | 综合电影网 | 我和我的祖国电影在线观看免费版高清 | 欧美一级高潮片免费的 | 欧美一区二区三区视频 | 亚洲国产一区在线 |