CREATE PROCEDURE GetGroups ( @Col1 bit, @Col2 bit, @Col3 bit, @Col4 bit, @Col5 bit, @Col6 bit, @Col7 bit, @Col8 bit, @Col9 bit, @Col10 bit ) AS SELECT COUNT = COUNT(*), CASE @col1 WHEN 1 THEN COL1 END COL1, CASE @col2 WHEN 1 THEN COL2 END COL2, CASE @col3 WHEN 1 THEN COL3 END COL3, CASE @col4 WHEN 1 THEN COL4 END COL4, CASE @col5 WHEN 1 THEN COL5 END COL5, CASE @col6 WHEN 1 THEN COL6 END COL6, CASE @col7 WHEN 1 THEN COL7 END COL7, CASE @col8 WHEN 1 THEN COL8 END COL8, CASE @col9 WHEN 1 THEN COL9 END COL9, CASE @col10 WHEN 1 THEN COL10 END COL10 FROM YourTable GROUP BY CASE @col1 WHEN 1 THEN COL1 END, CASE @col2 WHEN 1 THEN COL2 END, CASE @col3 WHEN 1 THEN COL3 END, CASE @col4 WHEN 1 THEN COL4 END, CASE @col5 WHEN 1 THEN COL5 END, CASE @col6 WHEN 1 THEN COL6 END, CASE @col7 WHEN 1 THEN COL7 END, CASE @col8 WHEN 1 THEN COL8 END, CASE @col9 WHEN 1 THEN COL9 END, CASE @col10 WHEN 1 THEN COL10 END
UPDATE
By the way, since the resulting query is not built dynamically, it can be implemented as a table function:
CREATE FUNCTION fnGetGroups ( @Col1 bit, @Col2 bit, @Col3 bit, @Col4 bit, @Col5 bit, @Col6 bit, @Col7 bit, @Col8 bit, @Col9 bit, @Col10 bit ) RETURNS TABLE AS RETURN ( SELECT β¦ )
and call it instead of SP:
CREATE PROCEDURE GetGroups ( @Col1 bit, @Col2 bit, @Col3 bit, @Col4 bit, @Col5 bit, @Col6 bit, @Col7 bit, @Col8 bit, @Col9 bit, @Col10 bit ) AS SELECT * FROM fnGetGroups(@Col1, @Col2, @Col3, @Col4, @Col5, @Col6, @Col7, @Col8, @Col9, @Col10)
The fact is that TVF may be more convenient for use in various SQL scripts, while SP may be preferable for direct calling from an application.