• You can avoid group by altogether by using the OVER() method when using aggregates (I think this is for SQL2008 and higher).

    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL

    DROP TABLE #TempTable

    CREATE TABLE #TempTable (

    [ID] INT IDENTITY(1,1) NOT NULL,

    [Age] INT NULL,

    [Sex] CHAR(1) NULL,

    [School] VARCHAR(20) NULL,

    PRIMARY KEY (ID))

    INSERT INTO #TempTable

    SELECT 22,'M','Thomasville'

    UNION

    SELECT 19,'M','Thomasville'

    UNION

    SELECT 31,'F','Polytechnic'

    UNION

    SELECT 20,'M','Thomasville'

    UNION

    SELECT 32,'F','Polytechnic'

    UNION

    SELECT 27,'F','Thomasville'

    UNION

    SELECT 22,'M','Polytechnic'

    UNION

    SELECT 18,'M','Thomasville'

    UNION

    SELECT 40,'F','Thomasville'

    SELECT * FROM #TempTable

    DECLARE

    @Category VARCHAR(50)

    SET @Category = 'Sex'

    SELECT DISTINCT

    (CASE

    WHEN @Category = 'Sex' THEN Sex

    WHEN @Category = 'School' THEN School

    END) AS Category

    ,(CASE

    WHEN @Category = 'Sex' THEN MIN(Age) OVER (PARTITION BY Sex)

    WHEN @Category = 'School' THEN MIN(Age) OVER (PARTITION BY School)

    END) AS MinAge

    ,(CASE

    WHEN @Category = 'Sex' THEN AVG(Age) OVER (PARTITION BY Sex)

    WHEN @Category = 'School' THEN AVG(Age) OVER (PARTITION BY School)

    END) AS Average

    ,(CASE

    WHEN @Category = 'Sex' THEN MAX(Age) OVER (PARTITION BY Sex)

    WHEN @Category = 'School' THEN MAX(Age) OVER (PARTITION BY School)

    END) AS MaxAge

    FROM

    #TempTable

    SET @Category = 'School'

    SELECT DISTINCT

    (CASE

    WHEN @Category = 'Sex' THEN Sex

    WHEN @Category = 'School' THEN School

    END) AS Category

    ,(CASE

    WHEN @Category = 'Sex' THEN MIN(Age) OVER (PARTITION BY Sex)

    WHEN @Category = 'School' THEN MIN(Age) OVER (PARTITION BY School)

    END) AS MinAge

    ,(CASE

    WHEN @Category = 'Sex' THEN AVG(Age) OVER (PARTITION BY Sex)

    WHEN @Category = 'School' THEN AVG(Age) OVER (PARTITION BY School)

    END) AS Average

    ,(CASE

    WHEN @Category = 'Sex' THEN MAX(Age) OVER (PARTITION BY Sex)

    WHEN @Category = 'School' THEN MAX(Age) OVER (PARTITION BY School)

    END) AS MaxAge

    FROM

    #TempTable

    Output all data:

    IDAgeSexSchool

    118MThomasville

    219MThomasville

    320MThomasville

    422MPolytechnic

    522MThomasville

    627FThomasville

    731FPolytechnic

    832FPolytechnic

    940FThomasville

    Output selected data:

    CategoryMinAgeAverageMaxAge

    F273240

    M182022

    CategoryMinAgeAverageMaxAge

    Polytechnic222832

    Thomasville182440