分享小知识:善用Group By排序

如下列举了公用表/临时表/聚合函数三个因素为例子(覆盖索引因素除外,有利用此类索引都会以索引顺序)html

 环境:
Microsoft SQL Server 2014 (SP1-GDR) (KB3194720) - 12.0.4232.0 (X64) 
	Sep 23 2016 18:45:14 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 10240: )

  

--公用表表达式
--一、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID2,ID FROM CTE GROUP BY ID,ID2;

--二、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID,ID2,COUNT(*) FROM CTE GROUP BY ID,ID2;

--三、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID,ID2 FROM CTE GROUP BY ID2,ID;

--四、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
SELECT ID,ID2,COUNT(*) FROM CTE GROUP BY ID2,ID;

  

--临时表
IF OBJECT_ID('Tempdb..#CTE') IS NOT NULL
	DROP TABLE #CTE;
SELECT 1 AS ID,2 AS ID2 INTO #CTE
UNION ALL
SELECT 2 AS ID,1 AS ID2
--五、
SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID,ID2;
--六、
SELECT ID,ID2 FROM #CTE GROUP BY ID,ID2;
--七、
SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID2,ID;
--八、
SELECT ID,ID2 FROM #CTE GROUP BY ID2,ID;

显示效果:
sql

结论:表按分组列(group by 后)顺序没聚合函数时 从左到右,非则反之。特殊状况CTE时按存储显示列(SELECT)顺序从左到右
这一部分的列存储顺序函数

;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
UNION ALL
SELECT 0 AS ID,0 AS ID2
)
相关文章
相关标签/搜索