SQLSERVER中union,cube,rollup,cumpute運算符應用解釋。本站提示廣大學習愛好者:(SQLSERVER中union,cube,rollup,cumpute運算符應用解釋)文章只能為提供參考,不一定能成為您想要的結果。以下是SQLSERVER中union,cube,rollup,cumpute運算符應用解釋正文
/*
--1 UNION 運算符是將兩個或更多查詢的成果組合為單個成果集
應用 UNION 組合查詢的成果集有兩個最根本的規矩:
1。一切查詢中的列數和列的次序必需雷同。
2。數據類型必需兼容
a.UNION的成果集列名與第一個select語句中的成果集中的列名雷同,其他select語句的成果集列名被疏忽
b.默許情形下,UNION 運算符是從成果集中刪除反復行。假如應用all症結字,那末成果集將包括一切行而且不刪除反復行
c.sql是從左到右對包括UNION 運算符的語句停止取值,應用括號可以轉變求值次序
--例如:
*/
select * from tablea
union all
(
select * from tableb
union all
select * from tablec
)
/*
如許便可以先對tableb和tablec歸並,再歸並tablea
d.假如要將歸並後的成果集保留到一個新數據表中,那末into語句必需參加到第一條select中
e.只可以在最初一條select語句中應用 order by 和 compute 子句,如許影響到終究歸並成果的排序和計數匯總
f.group by 和 having 子句可以在零丁一個select查詢中應用,它們不影響終究成果
*/
--2 CUBE 匯總數據
/*
CUBE 運算符生成的成果集是多維數據集。多維數據集是現實數據的擴大,現實數據即記載個體事宜的數據。
擴大樹立在用戶盤算剖析的列上。這些列被稱為維。多維數據集是一個成果集,個中包括了各維度的一切能夠組合的穿插表格。
CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包括維度列和聚合函數表達式。
GROUP BY 應指定維度列和症結字 WITH CUBE。成果集將包括維度列中各值的一切能夠組合,和與這些維度值組合相婚配的基本行中的聚合值。
*/
--以下查詢前往的成果集中,將包括 Item 和 Color 的一切能夠組合的 Quantity 小計:
-->Title:生成測試數據
-->Author:wufeng4552
-->Date :2009-09-10 14:36:20
if not object_id('Tempdb..#t') is null
drop table #t
Go
Create table #t([Item] nvarchar(5),[Color] nvarchar(4),[Quantity] int)
Insert #t
select N'Table',N'Blue',124 union all
select N'Table',N'Red',223 union all
select N'Chair',N'Blue',101 union all
select N'Chair',N'Red',210
Go
select [Item],
[Color],
sum([Quantity])[Quantity]
from #t group by [Item],[Color] with cube
/*
Item Color Quantity
----- ----- -----------
Chair Blue 101
Chair Red 210
Chair NULL 311
Table Blue 124
Table Red 223
Table NULL 347
NULL NULL 658
NULL Blue 225
NULL Red 433
*/
/*CUBE 操作所生成的空值帶來一個成績:若何辨別 CUBE 操作所生成的 NULL 值和從現實數據中前往的 NULL 值?
這個成績可用 GROUPING 函數處理。
假如列中的值來自現實數據,則 GROUPING 函數前往 0;假如列中的值是 CUBE 操作所生成的 NULL,則前往 1。
在 CUBE 操作中,所生成的 NULL 代表全部值。可將 SELECT 語句寫成應用 GROUPING 函數將所生成的 NULL 調換為字符串 ALL。
由於現實數據中的 NULL 注解數據值未知,所以 SELECT 語句還可譯碼為前往字符串 UNKNOWN 替換來自現實數據的 NULL。
例如:
*/
-->Title:生成測試數據
-->Author:wufeng4552
-->Date :2009-09-10 14:36:20
if not object_id('Tempdb..#t') is null
drop table #t
Go
Create table #t([Item] nvarchar(5),[Color] nvarchar(4),[Quantity] int)
Insert #t
select N'Table',N'Blue',124 union all
select N'Table',N'Red',223 union all
select N'Chair',N'Blue',101 union all
select N'Chair',N'Red',210
Go
select [Item]=case when grouping([Item])=1 then 'ALL' else isnull(Item, 'UNKNOWN')end,
[Color]=case when grouping([Color])=1 then 'ALL' else isnull([Color],'UNKNOWN')end,
sum([Quantity])[Quantity]
from #t group by [Item],[Color] with cube
/*
Item Color Quantity
----- ----- -----------
Chair Blue 101
Chair Red 210
Chair ALL 311
Table Blue 124
Table Red 223
Table ALL 347
ALL ALL 658
ALL Blue 225
ALL Red 433
(9 個資料列遭到影響)
*/
/*
包括帶有很多維度的 CUBE 的 SELECT 語句能夠生成很年夜的成果集,由於這些語句會為一切維度中值的一切組合生成行。
這些年夜成果集包括的數據能夠過量而不容易於浏覽和懂得。這個成績有一種處理方法是將 SELECT 語句放在視圖中:
*/
create view view_cube
as
select [Item]=case when grouping([Item])=1 then 'ALL' else isnull(Item, 'UNKNOWN')end,
[Color]=case when grouping([Color])=1 then 'ALL' else isnull([Color],'UNKNOWN')end,
sum([Quantity])[Quantity]
from tb group by [Item],[Color] with cube --視圖中不克不及用臨時表,故改之
--然後便可用該視圖來只查詢您感興致的維度值:
SELECT *
FROM InvCube
WHERE Item = 'Chair' AND Color = 'ALL'
/*
Item Color QtySum
-------------------- -------------------- ---------
Chair ALL 311.00
*/
--3 ROLLUP 匯總數據
/*
用 ROLLUP 匯總數據在生成包括小計和算計的報表時,ROLLUP 運算符很有效。
ROLLUP 運算符生成的成果集相似於 CUBE 運算符所生成的成果集。
CUBE 和 ROLLUP 之間的差別在於: CUBE 生成的成果集顯示了所選列中值的一切組合的聚合。
ROLLUP 生成的成果集顯示了所選列中值的某一條理構造的聚合。 例如,簡略表 #t
中包括:Item Color Quantity
*/
select [Item]=case when grouping([Item])=1 then 'ALL' else isnull(Item, 'UNKNOWN')end,
[Color]=case when grouping([Color])=1 then 'ALL' else isnull([Color],'UNKNOWN')end,
sum([Quantity])[Quantity]
from #t group by [Item],[Color] with rollup
/*
Item Color Quantity
----- ----- -----------
Chair Blue 101
Chair Red 210
Chair ALL 311
Table Blue 124
Table Red 223
Table ALL 347
ALL ALL 658
(7 個資料列遭到影響)
*/
/*
假如查詢中的 ROLLUP 症結字更改成 CUBE,那末 CUBE 成果集與上述成果雷同,只是在成果集的末尾還會前往以下兩行:ALL Blue 225.00
ALL Red 433.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 生成的更加高效。
*/