程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 正確利用 ADO.NET

正確利用 ADO.NET

編輯:關於SqlServer

您正在看的SQLserver教程是:正確利用 ADO.Net。

表格報表以行的格式列出信息,這些行就像數據庫表的行一樣。表格報表中的列標頭與表的列名相關聯。表格相交叉的報表(簡稱交叉表報表)是二維矩陣或電子表格,電子表格的查找標准是沿列標頭的頂部向右以及沿行標頭的左側向下進行查找。您查找的數據 — 通常由諸如 SUM()、AVERAGE() 或 COUNT() 的聚合函數進行匯總 — 占據了矩陣的內部單元。

例如,假設您為全球知名的 Pubs 連鎖書店工作,而該公司的首席執行官希望知道該公司的作者所著的書籍在公司每個書店的銷售情況。您可以通過使用與 sqlmag02/Html/ontargetwithado_netListing_01.txt" target="_blank">清單 1(第 22 頁)所創建的視圖相類似的視圖來創建一個列數為 3 的表格報表。此視圖名為 vwSales,它列出了按書店和作者分組的圖書總銷售額,其中,每個作者—書店—銷售額元組列在一行中。sqlserver/art/ontargetwithado_netfigure_01.gif" target="_blank">圖 1 (第 22 頁)顯示了清單 1 的視圖生成的表格報表。不過,如果您將報表呈現為交叉表報表(例如,第 22 頁的sqlserver/art/ontargetwithado_netfigure_02.gif" target="_blank">圖 2 顯示的報表),則報表會更直觀,並可以傳遞更多的信息。交叉表報表將書店名稱在列標頭中水平地列出,而不是沿著各行中的作者姓名列出。因此,要查找作者 Stearns MacFeather 在書店 Bookbeat 的銷售額,應該看 Stearns MacFeather 行和 Bookbeat 列的交叉部分。

交叉表報表分為兩類:寬度固定的報表和寬度可變的報表。對於寬度固定的報表,您在設計時就知道報表中的列數和列名。使用 T-SQL 查詢來生成寬度固定的交叉表報表非常簡單,因為您可以對聚合函數中嵌入的 CASE 表達式進行硬編碼,從而對輸出的每一列進行求值。sqlmag02/html/ontargetwithado_netListing_02.txt" target="_blank">清單 2顯示了針對我們舉例的 Pubs 書店應用程序在寬度固定的交叉表查詢中使用 CASE 表達式的示例。清單 2 中的第一個 CASE 表達式的含義是:如果 Store 列中的值等於 "Barnum's",則返回 Sales 列中的值;否則,返回 0。交叉表查詢在其列表達式中使用 SUM() 函數,因此無需預先聚合它用於其數據源的視圖中的數據。所以,在其 FROM 子句中,清單 2 中的交叉表查詢使用 sqlmag02/Html/ontargetwithado_netListing_03.txt" target="_blank">清單 3 創建的 vwSales2 視圖,而不是 vwSales。如果您使用 COUNT() 或 AVG() 作為聚合函數,則需要從 CASE 表達式中去掉 "Else 0";否則,答案將對其銷售值為 0 的交易進行平均和計數,而這樣的交易實際上並不存在。當您從 CASE 表達式中去掉 "Else 0" 後,對於不存在任何記錄的作者—書店組合,將得到 NULL 值,而不是零。

但我們假設 Pubs 有一百家書店,每個月都有一些新書店開張,同時也有其他一些書店關張。由於這個原因,您需要一個寬度可變的交叉表報表,該報表從數據中動態地讀取書店名稱,無論當月存在多少書店,都為每個名稱生成一個列。現在我們來探討用於生成寬度可變的交叉表報表的兩個完全不同的方法。第一個示例在存儲過程中使用動態 SQL 來創建包含 CASE 表達式的交叉表查詢字符串。EXEC 命令執行該查詢字符串,以便返回報表。第二個示例不使用 CASE 表達式或動態 SQL,它使用 ADO.NET 中新的關系特性 — Visual Studio .Net 中的數據訪問組件 — 對數據進行交叉制表。下面我將順便指出每種方法的優點和缺點。

使用動態 SQL

sqlmag02/Html/ontargetwithado_netListing_04.txt" target="_blank">清單 4顯示的存儲過程 procXTabDSQL 使用 vwSales2 視圖以及在整個書店名稱列表中循環的本地游標生成交叉表查詢字符串。該查詢字符串以行標頭作為第一列。然後,該過程在書店名稱列表上打開游標。該游標將各個書店名稱放到變量 @StoreName 中。每個迭代生成包含圍繞 CASE 表達式的 SUM() 函數的字符串,然後將該字符串連接到 varchar 變量 @strSQL。每個 SUM() 函數在最終報表中生成一列輸出。

第一個 SUM() 函數中的 CASE 表達式用於報表的 Barnum's 書店列。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved