Overview

SELECT 
	DATEPART(yyyy,OrderDate) AS N'Year',
	SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate) 
ORDER BY DATEPART(yyyy,OrderDate);

GROUP BY vs. DISTINCT Performance

HAVING Clause

SELECT DATEPART(yyyy,OrderDate) AS N'Year',
	SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
HAVING DATEPART(yyyy,OrderDate) >= 2003
ORDER BY DATEPART(yyyy,OrderDate);

[ROLLUP()](<https://learn.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?group-by-rollup>)

SELECT
	[Region] = [T].[Group],
	[Territory] = [T].[Name],
	[Year] = DATEPART(yyyy, [S].[OrderDate]),
	[Month] = DATEPART(mm, [S].[OrderDate]),
	[TotalRevenue] = SUM([S].[TotalDue])
FROM Sales.SalesOrderHeader AS [S]
INNER JOIN Sales.SalesTerritory AS [T]
	ON [S].TerritoryID = [T].TerritoryID
GROUP BY ROLLUP
(
	[T].[Group],
	[T].[Name],
	DATEPART(yyyy, [S].[OrderDate]), 
	DATEPART(mm, [S].[OrderDate])
)

[CUBE()](<https://learn.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?#group-by-cube-->)