亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQLServer中匯總功能的使用GROUPING,ROLLUP和CUBE

2024-08-31 00:58:26
字體:
來源:轉載
供稿:網友

第一次看到這樣的SQL語句,看不懂,其中用到了下面的不常用的

聚集函數:GROUPING

用于匯總數據用的運算符: ROLLUP

SELECT 

CASE GROUPING(o.customerid) WHEN 0 THEN o.customerid ELSE  '(Total)' END 

AS AllCustomersSummary, 

CASE GROUPING(od.orderid) WHEN 0 THEN od.orderid ELSE -1 END 

AS IndividualCustomerSummary, 

SUM(od.quantity*od.unitprice) AS price 

FROM Orders o, [Order Details] od 

WHERE Year(o.orderdate) = 1998 AND od.orderid=o.orderid 

GROUP BY o.customerid, od.orderid WITH ROLLUP 

ORDER BY AllCustomersSummary 

查看SQL Server的幫助才發現,厲害啊,原來還有這么厲害的東西,不由的想起以前做水晶報表的時候,原來在SQL Server中就可以實現這樣的功能.

1.用 CUBE 匯總數據

CUBE 運算符生成的結果集是多維數據集。多維數據集是事實數據的擴展,事實數據即記錄個別事件的數據。擴展建立在用戶打算分析的列上。這些列被稱為維。多維數據集是一個結果集,其中包含了各維度的所有可能組合的交叉表格。

CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包含維度列和聚合函數表達式。GROUP BY 應指定維度列和關鍵字 WITH CUBE。結果集將包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。

例如,一個簡單的表 Inventory 中包含:

 

ItemColorQuantity-------------------- -------------------- -------------------------- TableBlue124TableRed223ChairBlue101ChairRed210

下列查詢返回的結果集中,將包含 Item 和 Color 的所有可能組合的 Quantity 小計:

 

SELECT Item, Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE

下面是結果集:

 

ItemColorQtySum-------------------- -------------------- -------------------------- ChairBlue101.00ChairRed210.00Chair(null)311.00TableBlue124.00TableRed223.00Table(null)347.00(null)(null)658.00(null)Blue225.00(null)Red433.00

我們著重考查下列各行:

 

Chair(null)311.00

這一行報告了 Item 維度中值為 Chair 的所有行的小計。對 Color 維度返回了 NULL 值,表示該行所報告的聚合包括 Color 維度為任意值的行。

 

Table(null)347.00

這一行類似,但報告的是 Item 維度中值為 Table 的所有行的小計。

 

(null)(null)658.00

這一行報告了多維數據集的總計。Item 和 Color 維度的值都是 NULL,表示兩個維度中的所有值都匯總在該行中。

 

(null)Blue225.00(null)Red433.00

這兩行報告了 Color 維度的小計。兩行中的 Item 維度值都是 NULL,表示聚合數據來自 Item 維度為任意值的行。

使用 GROUPING 區分空值

CUBE 操作所生成的空值帶來一個問題:如何區分 CUBE 操作所生成的 NULL 值和從實際數據中返回的 NULL 值?這個問題可用 GROUPING 函數解決。如果列中的值來自事實數據,則 GROUPING 函數返回 0;如果列中的值是 CUBE 操作所生成的 NULL,則返回 1。在 CUBE 操作中,所生成的 NULL 代表全體值??蓪?SELECT 語句寫成使用 GROUPING 函數將所生成的 NULL 替換為字符串 ALL。因為事實數據中的 NULL 表明數據值未知,所以 SELECT 語句還可譯碼為返回字符串 UNKNOWN 替代來自事實數據的 NULL。例如:

 

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE多維數據集

CUBE 運算符可用于生成 n 維的多維數據集,即具有任意數目維度的多維數據集。只有一個維度的多維數據集可用于生成合計,例如:

 

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'ELSE ISNULL(Item, 'UNKNOWN') END AS Item, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item WITH CUBEGO

此 SELECT 語句返回的結果集既顯示了 Item 中每個值的小計,也顯示了 Item 中所有值的總計:

 

ItemQtySum-------------------- -------------------------- Chair311.00Table347.00ALL658.00

包含帶有許多維度的 CUBE 的 SELECT 語句可能生成很大的結果集,因為這些語句會為所有維度中值的所有組合生成行。這些大結果集包含的數據可能過多而不易于閱讀和理解。這個問題有一種解決辦法是將 SELECT 語句放在視圖中:

 

CREATE VIEW InvCube ASSELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE

然后即可用該視圖來只查詢您感興趣的維度值:

 

SELECT *FROM InvCubeWHERE Item = 'Chair' AND Color = 'ALL'ItemColorQtySum-------------------- -------------------- -------------------------- ChairALL311.00(1 row(s) affected)



2.用 ROLLUP 匯總數據

在生成包含小計和合計的報表時,ROLLUP 運算符很有用。ROLLUP 運算符生成的結果集類似于 CUBE 運算符所生成的結果集。有關更多信息.

CUBE 和 ROLLUP 之間的區別在于:

  • CUBE 生成的結果集顯示了所選列中值的所有組合的聚合。

  • ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。
  • 例如,簡單表 Inventory 中包含:

     

    ItemColorQuantity-------------------- -------------------- -------------------------- TableBlue124TableRed223ChairBlue101ChairRed210

    下列查詢將生成小計報表:

     

    SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH ROLLUPItemColorQtySum-------------------- -------------------- -------------------------- ChairBlue101.00ChairRed210.00ChairALL311.00TableBlue124.00TableRed223.00TableALL347.00ALLALL658.00(7 row(s) affected)

    如果查詢中的 ROLLUP 關鍵字更改為 CUBE,那么 CUBE 結果集與上述結果相同,只是在結果集的末尾還會返回下列兩行:

     

    ALLBlue225.00ALLRed433.00

    CUBE 操作為 Item 和 Color 中值的可能組合生成行。例如,CUBE 不僅報告與 Item 值 Chair 相組合的 Color 值的所有可能組合(Red、Blue 和 Red + Blue),而且報告與 Color 值 Red 相組合的 Item 值的所有可能組合(Chair、Table 和 Chair + Table)。

    對于 GROUP BY 子句中右邊的列中的每個值,ROLLUP 操作并不報告左邊一列(或左邊各列)中值的所有可能組合。例如,ROLLUP 并不對每個 Color 值報告 Item 值的所有可能組合。

    ROLLUP 操作的結果集具有類似于 COMPUTE BY 所返回結果集的功能;然而,ROLLUP 具有下列優點:

  • ROLLUP 返回單個結果集;COMPUTE BY 返回多個結果集,而多個結果集會增加應用程序代碼的復雜性。

  • ROLLUP 可以在服務器游標中使用;COMPUTE BY 不可以。

  • 有時,查詢優化器為 ROLLUP 生成的執行計劃比為 COMPUTE BY 生成的更為高效。
  •  

     

    3.GROUPING

    是一個聚合函數,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值為1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值為0。

    僅在與包含 CUBE 或 ROLLUP 運算符的 GROUP BY 子句相聯系的選擇列表中才允許分組。

    語法

    GROUPING ( column_name )

    參數

    column_name

    是 GROUP BY 子句中用于檢查 CUBE 或 ROLLUP 空值的列。

    返回類型

    int

    注釋

    分組用于區分由 CUBE 和 ROLLUP 返回的空值和標準的空值。作為CUBE 或 ROLLUP 操作結果返回的 NULL 是 NULL 的特殊應用。它在結果集內作為列的占位符,意思是"全體"。

    示例

    下面的示例將 royalty 的數值分組,并聚合 advance 的數值。GROUPING 函數應用于 royalty 列。

     

    USE pubsSELECT royalty, SUM(advance) 'total advance', GROUPING(royalty) 'grp' FROM titles GROUP BY royalty WITH ROLLUP

    結果集在 royalty 下顯示兩個空值。第一個 NULL 代表從表中這一列得到的空值組。第二個 NULL 在 ROLLUP 操作所添加的匯總行中。匯總行顯示的是所有 royalty 組的 advance 合計數值,并且在 grp 列中用 1 標識。

    下面是結果集:

     

    royalty total advancegrp --------- --------------------- ---NULLNULL0 1057000.00000 122275.00000 144000.00000 167000.00000 2425125.00000 NULL95400.00001


     

     

    3.GROUPING

    是一個聚合函數,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值為1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值為0。

    僅在與包含 CUBE 或 ROLLUP 運算符的 GROUP BY 子句相聯系的選擇列表中才允許分組。

    語法

    GROUPING ( column_name )

    參數

    column_name

    是 GROUP BY 子句中用于檢查 CUBE 或 ROLLUP 空值的列。

    返回類型

    int

    注釋

    分組用于區分由 CUBE 和 ROLLUP 返回的空值和標準的空值。作為CUBE 或 ROLLUP 操作結果返回的 NULL 是 NULL 的特殊應用。它在結果集內作為列的占位符,意思是"全體"。

    示例

    下面的示例將 royalty 的數值分組,并聚合 advance 的數值。GROUPING 函數應用于 royalty 列。

     

    USE pubsSELECT royalty, SUM(advance) 'total advance', GROUPING(royalty) 'grp' FROM titles GROUP BY royalty WITH ROLLUP

    結果集在 royalty 下顯示兩個空值。第一個 NULL 代表從表中這一列得到的空值組。第二個 NULL 在 ROLLUP 操作所添加的匯總行中。匯總行顯示的是所有 royalty 組的 advance 合計數值,并且在 grp 列中用 1 標識。

    下面是結果集:

     

    royalty total advancegrp --------- --------------------- ---NULLNULL0 1057000.00000 122275.00000 144000.00000 167000.00000 2425125.00000 NULL95400.00001


     

     

    3.GROUPING

    是一個聚合函數,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值為1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值為0。

    僅在與包含 CUBE 或 ROLLUP 運算符的 GROUP BY 子句相聯系的選擇列表中才允許分組。

    語法

    GROUPING ( column_name )

    參數

    column_name

    是 GROUP BY 子句中用于檢查 CUBE 或 ROLLUP 空值的列。

    返回類型

    int

    注釋

    分組用于區分由 CUBE 和 ROLLUP 返回的空值和標準的空值。作為CUBE 或 ROLLUP 操作結果返回的 NULL 是 NULL 的特殊應用。它在結果集內作為列的占位符,意思是"全體"。

    示例

    下面的示例將 royalty 的數值分組,并聚合 advance 的數值。GROUPING 函數應用于 royalty 列。

     

    USE pubsSELECT royalty, SUM(advance) 'total advance', GROUPING(royalty) 'grp' FROM titles GROUP BY royalty WITH ROLLUP

    結果集在 royalty 下顯示兩個空值。第一個 NULL 代表從表中這一列得到的空值組。第二個 NULL 在 ROLLUP 操作所添加的匯總行中。匯總行顯示的是所有 royalty 組的 advance 合計數值,并且在 grp 列中用 1 標識。

    下面是結果集:

     

    royalty total advancegrp --------- --------------------- ---NULLNULL0 1057000.00000 122275.00000 144000.00000 167000.00000 2425125.00000 NULL95400.00001

    對GROUPING,ROLLUP,CUBE的介紹來自SQL Server2000中文版的幫助.

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    国产一区二区三区高清在线观看| 茄子视频成人在线| 国产在线日韩在线| 亚洲精品久久久久久久久| 欧美久久久精品| 26uuu久久噜噜噜噜| 欧美自拍大量在线观看| 超碰精品一区二区三区乱码| 国产亚洲精品综合一区91| 国产视频在线一区二区| 国产精品福利观看| 国产免费观看久久黄| 欧美黑人性猛交| 欧美日韩在线视频一区| 色哟哟亚洲精品一区二区| 国内偷自视频区视频综合| 奇米一区二区三区四区久久| 国产精品黄页免费高清在线观看| 国产精品一区二区3区| 精品亚洲va在线va天堂资源站| 日韩精品免费视频| 久久精品久久精品亚洲人| 欧美日韩精品在线视频| 4438全国成人免费| 2020久久国产精品| 日韩免费在线电影| 欧美激情视频一区二区三区不卡| 欧美极品少妇与黑人| 国产精品一区二区三区成人| 亚洲黄色在线看| 91在线精品播放| 国产欧美在线视频| 国产91精品最新在线播放| 尤物九九久久国产精品的特点| 欧美午夜性色大片在线观看| 日韩免费在线视频| 日韩高清电影好看的电视剧电影| 日本欧美一二三区| 亚洲成av人片在线观看香蕉| 欧美日韩加勒比精品一区| 久久这里有精品视频| 欧美专区中文字幕| 日韩av网址在线| 亚洲女人被黑人巨大进入| 国产剧情久久久久久| 色先锋资源久久综合5566| 亚洲欧美日韩精品久久| 日韩中文在线中文网在线观看| 国产精品福利在线观看网址| 欧美精品久久一区二区| 91色视频在线观看| 黑人巨大精品欧美一区二区三区| 日本老师69xxx| 国产精品久久久久久久久久尿| 欧美精品在线网站| 亚洲专区中文字幕| 国产精品第一视频| 88xx成人精品| 91国产精品电影| 亚洲精品国产品国语在线| 亚洲色无码播放| 欧美专区在线观看| 91精品国产自产在线观看永久| 久久av资源网站| 国产精欧美一区二区三区| 国产精品扒开腿爽爽爽视频| 欧美一区二区三区精品电影| 国产成人亚洲综合| 亚洲精品成a人在线观看| 欧美激情在线观看视频| 国产精品专区h在线观看| 狠狠躁18三区二区一区| 久久久久成人网| 亚洲a级在线播放观看| 亚洲一区二区三区成人在线视频精品| 美日韩精品视频免费看| 国产精品爱久久久久久久| 久久久国产精彩视频美女艺术照福利| 亚洲女人初尝黑人巨大| 精品偷拍一区二区三区在线看| 欧美日韩激情视频8区| 成人中文字幕+乱码+中文字幕| 亚洲欧洲国产伦综合| 国产美女91呻吟求| 国内精品久久久久久中文字幕| 国产www精品| 亚洲成人av片在线观看| 羞羞色国产精品| 国产在线98福利播放视频| 亚洲高清免费观看高清完整版| 精品中文字幕在线| 成人有码视频在线播放| 亚洲福利视频专区| 亚洲一区二区三区四区视频| 亚洲黄在线观看| 欧美日韩美女在线| 欧美专区在线观看| 成人信息集中地欧美| 精品视频中文字幕| 久久久中精品2020中文| 亚洲最新av网址| 欧美性xxxxhd| 国产精品一久久香蕉国产线看观看| 欧美午夜精品在线| 国产午夜精品美女视频明星a级| 精品国偷自产在线| 成人网在线免费观看| 成人444kkkk在线观看| 国内精品久久久久影院 日本资源| 日韩欧美精品中文字幕| 成人免费自拍视频| 亚洲欧美成人在线| 欧美高清在线播放| 亚洲欧洲黄色网| 中文字幕精品国产| 久久国产精品99国产精| 亚洲激情视频在线| 亚洲区bt下载| 精品久久香蕉国产线看观看gif| 欧美精品在线观看| 国内外成人免费激情在线视频| 久久精品电影网| 成人a在线观看| 欧美成人激情视频免费观看| 亚洲理论在线a中文字幕| 久久久精品国产一区二区| 久久精品亚洲精品| 欧美中文在线免费| 国产精品视频大全| 欧美激情欧美狂野欧美精品| 美女视频黄免费的亚洲男人天堂| 国精产品一区一区三区有限在线| 久久欧美在线电影| 国产精品久久久久久久久久新婚| 国产精品va在线播放我和闺蜜| 91精品国产91久久久久久吃药| 黑人巨大精品欧美一区二区免费| 91av在线免费观看视频| 色妞在线综合亚洲欧美| 久久亚洲影音av资源网| 久久精品一本久久99精品| 国产精品h片在线播放| 91在线高清免费观看| 欧美电影《睫毛膏》| 欧美激情免费视频| 欧美激情网友自拍| 91豆花精品一区| 国产精品久久av| 欧美日韩国产精品一区二区不卡中文| 午夜精品久久久久久99热软件| 91沈先生作品| 亚洲已满18点击进入在线看片| 亚洲精品乱码久久久久久金桔影视| 欧美疯狂性受xxxxx另类| 亚洲国产欧美久久| 欧美丰满少妇xxxx| 精品日本美女福利在线观看| 国产精品揄拍一区二区| 亚洲国产成人精品一区二区| 日本精品性网站在线观看| 国产美女搞久久| 亚洲综合一区二区不卡| 亚洲欧洲日产国码av系列天堂| 日韩福利在线播放|