Starting with our data in a table named [CurrentData]
Row School LocationCode Year
--- ------ ------------ ----
001 ABC 1000A 2011
002 DEF 1000A 2011
003 GHI 1000X 2011
the query
SELECT
cd1.Year,
cd1.LocationCode,
cd1.School,
COUNT(*) AS SchoolRank
FROM
CurrentData AS cd1
INNER JOIN
CurrentData AS cd2
ON cd2.Year = cd1.Year
AND cd2.LocationCode = cd1.LocationCode
AND cd2.School <= cd1.School
GROUP BY
cd1.Year,
cd1.LocationCode,
cd1.School
produces
Year LocationCode School SchoolRank
---- ------------ ------ ----------
2011 1000A ABC 1
2011 1000A DEF 2
2011 1000X GHI 1
A very minor tweak to that converts the rank number to a string like "School_1"
SELECT
cd1.Year,
cd1.LocationCode,
cd1.School,
'School_' & COUNT(*) AS XtabColumn
FROM
CurrentData AS cd1
INNER JOIN
CurrentData AS cd2
ON cd2.Year = cd1.Year
AND cd2.LocationCode = cd1.LocationCode
AND cd2.School <= cd1.School
GROUP BY
cd1.Year,
cd1.LocationCode,
cd1.School
producing
Year LocationCode School XtabColumn
---- ------------ ------ ----------
2011 1000A ABC School_1
2011 1000A DEF School_2
2011 1000X GHI School_1
We can just wrap that in the code to produce a crosstab query
TRANSFORM First(School) AS whatever
SELECT [Year], LocationCode
FROM
(
SELECT
cd1.Year,
cd1.LocationCode,
cd1.School,
'School_' & COUNT(*) AS XtabColumn
FROM
CurrentData AS cd1
INNER JOIN
CurrentData AS cd2
ON cd2.Year = cd1.Year
AND cd2.LocationCode = cd1.LocationCode
AND cd2.School <= cd1.School
GROUP BY
cd1.Year,
cd1.LocationCode,
cd1.School
) AS something
GROUP BY [Year], LocationCode
PIVOT XtabColumn
and we get
Year LocationCode School_1 School_2
---- ------------ -------- --------
2011 1000A ABC DEF
2011 1000X GHI