People are often scared to put case statements in their GROUP BY clause because it could impact query performance. In this article by Grant Fritchey, he shows a few examples of how this might or might not work well, as well as how to verify if you have it working correctly.
You can click on that to expand it into something readable. We can eliminate the Parameter Sniffing from the equation if we want to by modifying the query thus:
CREATE PROCEDURE dbo.InvoiceGrouping_NoSniff (@x INT) AS DECLARE @x2 INT; SET @x2 = @x; SELECT SUM(il.UnitPrice), COUNT(i.ContactPersonID), COUNT(i.AccountsPersonID), COUNT(i.SalespersonPersonID) FROM Sales.Invoices AS i JOIN Sales.InvoiceLines AS il ON il.InvoiceID = i.InvoiceID GROUP BY CASE WHEN @x2 = 7 THEN i.ContactPersonID WHEN @x2 = 15 THEN i.AccountsPersonID ELSE i.SalespersonPersonID END; GO
However, except for some deviation on the estimated rows (since it’s averaging the rows returned), the execution plan is the same.