UNION 等集合操作符:
UNION 等以第一個 SELECT ?的 列明 作為 整個結果集的列明,整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY?
這個意思是說 只有 ORDER BY 是對整個結果集作用的,其它都操作都作用在 UINON 兩側的 子集合中。
EXCEPT 操作符也是 提出了重復值的
此外,它認為兩個 null 值是相等的,
而 NOT EXISTS 認為兩個 null 值不相等,
集合操作符的 優先級是 INTERSECT 最大,其它都一樣
CTE 遞歸 是個 重點, 分為 單個 定位點成員,單個遞歸成員,多個定位點,多個遞歸成員
1.?單個 定位點成員,單個遞歸成員
//todo
2.?多個定位點,多個遞歸成員
?
// todo
特別注意 只有一個維度去觀看的時候,WITH CUBE 或者 WITH ROLLUP 的結果是一樣的。
而下面 例子中的 WITH CUBE 或者 WITH ROLLUP 語句都會被 GROUP BY 后面的 CUBE(col1,col2) 或者 ROLLUP(col1,col2) 所替代,因為這種更加符合 ISO 標準些
IF?object_id('dbo.Inventory','U')?IS?NOT?NULL?
DROP?TABLE?dbo.Inventory?
GO
CREATE?TABLE?Inventory(
Item?varchar(5),
Color?char(4),
Qty?int
)
INSERT?INTO?dbo.Inventory?
VALUES('桌子','藍色',2),
('桌子','紅色',1),
('桌子','藍色',3),
('椅子','藍色',4),
('椅子','紅色',6),
('椅子','紅色',5)
select?Item,Color,SUM(Qty)?AS?Sum_Qty?from?dbo.Inventory?GROUP?BY?Item,Color WITH CUBE ?-- ?Group by Item,Color WITH CUBE 也可以替換為 Group by CUBE(Item,Color) 以下同理
select?Item,Color,SUM(Qty)?AS?Sum_Qty?from?dbo.Inventory?GROUP?BY?Item,Color?with?rollup
重點:
區分 空值與匯總值
使用 Grouping(Item) 或者 Grouping(Color) 函數 去區分
當 Grouping 函數返回 1 時候證明是匯總的,否則 就是真正的 null 值
1. Cube ------======---
select?
CASE?WHEN?Grouping(Item)?=?1?
Then?'匯總'?ELSE?ISNULL(Item,'未知')?
End?as?Item,
CASE?WHEN?Grouping(Color)?=?1?Then?'匯總'?ELSE?ISNULL(Color,'未知')?End?as?Item,
SUM(Qty)?AS?Sum_Qty?
from?dbo.Inventory?GROUP?BY?Item,Color?with?cube
2. 對于 ROLLUP ------======
select?
CASE?WHEN?Grouping(Item)?=?1?
Then?'匯總'?ELSE?ISNULL(Item,'未知')?
End?as?Item,
CASE?WHEN?Grouping(Color)?=?1?Then?'匯總'?ELSE?ISNULL(Color,'未知')?End?as?Item,
SUM(Qty)?AS?Sum_Qty?
from?dbo.Inventory?GROUP?BY?Item,Color?with?rollup
3.怎樣返回指定維度的 匯總:
1。 使用派生表 然后 對派生表 做 where 條件篩選
即 把上面匯總的 select 查詢語句做成一個 子查詢數據集
然后從這個 數據集中 篩選 Item is not null and Color is null 諸如此類的。
2. ? 使用GROUPING SETS 指定僅需要獲取所需的分組
不帶 null, null 這種情況的:
帶上 null , null 這種情況的?
?
UNION 等集合操作符:
UNION 等以第一個 SELECT ?的 列明 作為 整個結果集的列明,整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY?
這個意思是說 只有 ORDER BY 是對整個結果集作用的,其它都操作都作用在 UINON 兩側的 子集合中。
EXCEPT 操作符也是 提出了重復值的
此外,它認為兩個 null 值是相等的,
而 NOT EXISTS 認為兩個 null 值不相等,
集合操作符的 優先級是 INTERSECT 最大,其它都一樣
CTE 遞歸 是個 重點, 分為 單個 定位點成員,單個遞歸成員,多個定位點,多個遞歸成員
1.?單個 定位點成員,單個遞歸成員
//todo
2.?多個定位點,多個遞歸成員
?
// todo
特別注意 只有一個維度去觀看的時候,WITH CUBE 或者 WITH ROLLUP 的結果是一樣的。
而下面 例子中的 WITH CUBE 或者 WITH ROLLUP 語句都會被 GROUP BY 后面的 CUBE(col1,col2) 或者 ROLLUP(col1,col2) 所替代,因為這種更加符合 ISO 標準些
IF?object_id('dbo.Inventory','U')?IS?NOT?NULL?
DROP?TABLE?dbo.Inventory?
GO
CREATE?TABLE?Inventory(
Item?varchar(5),
Color?char(4),
Qty?int
)
INSERT?INTO?dbo.Inventory?
VALUES('桌子','藍色',2),
('桌子','紅色',1),
('桌子','藍色',3),
('椅子','藍色',4),
('椅子','紅色',6),
('椅子','紅色',5)
select?Item,Color,SUM(Qty)?AS?Sum_Qty?from?dbo.Inventory?GROUP?BY?Item,Color WITH CUBE ?-- ?Group by Item,Color WITH CUBE 也可以替換為 Group by CUBE(Item,Color) 以下同理
select?Item,Color,SUM(Qty)?AS?Sum_Qty?from?dbo.Inventory?GROUP?BY?Item,Color?with?rollup
重點:
區分 空值與匯總值
使用 Grouping(Item) 或者 Grouping(Color) 函數 去區分
當 Grouping 函數返回 1 時候證明是匯總的,否則 就是真正的 null 值
1. Cube ------======---
select?
CASE?WHEN?Grouping(Item)?=?1?
Then?'匯總'?ELSE?ISNULL(Item,'未知')?
End?as?Item,
CASE?WHEN?Grouping(Color)?=?1?Then?'匯總'?ELSE?ISNULL(Color,'未知')?End?as?Item,
SUM(Qty)?AS?Sum_Qty?
from?dbo.Inventory?GROUP?BY?Item,Color?with?cube
2. 對于 ROLLUP ------======
select?
CASE?WHEN?Grouping(Item)?=?1?
Then?'匯總'?ELSE?ISNULL(Item,'未知')?
End?as?Item,
CASE?WHEN?Grouping(Color)?=?1?Then?'匯總'?ELSE?ISNULL(Color,'未知')?End?as?Item,
SUM(Qty)?AS?Sum_Qty?
from?dbo.Inventory?GROUP?BY?Item,Color?with?rollup
3.怎樣返回指定維度的 匯總:
1。 使用派生表 然后 對派生表 做 where 條件篩選
即 把上面匯總的 select 查詢語句做成一個 子查詢數據集
然后從這個 數據集中 篩選 Item is not null and Color is null 諸如此類的。
2. ? 使用GROUPING SETS 指定僅需要獲取所需的分組
不帶 null, null 這種情況的:
帶上 null , null 這種情況的?
?