There are several ways to achieve your goal:
SELECT Teams, Games = COUNT(*) FROM ( SELECT Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' + CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END FROM MY_TABLE ) AS T GROUP BY Teams
OR if you are using SQL 2005/2008
;WITH T AS ( SELECT Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' + CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END FROM MY_TABLE ) SELECT Teams, Games = COUNT(*) FROM T GROUP BY Teams
Both of the above will give you the same result
Here is a script you can play with:
DECLARE @t AS TABLE ( ID INT, Team1 CHAR(1), Team2 CHAR(1), playdate [DATETIME] ) INSERT INTO @t (Team1 , Team2 , playdate) SELECT 'A' , 'B', '20110525' UNION ALL SELECT 'B' , 'A', '20110526' UNION ALL SELECT 'A' , 'C', '20110527' UNION ALL SELECT 'C' , 'B', '20110528' UNION ALL SELECT 'A' , 'B', '20110528' ;WITH T AS ( SELECT Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' + CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END FROM @t ) SELECT Teams, Games = COUNT(*) FROM T GROUP BY Teams SELECT Teams, Games = COUNT(*) FROM ( SELECT Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' + CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END FROM @t ) AS T GROUP BY Teams
/ * OR, use this to simply switch columns * /
;WITH T AS ( SELECT Team1 = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END , Team2 = CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END FROM @t ) SELECT Team1 , Team2, Games = COUNT(*) FROM T GROUP BY Team1 , Team2 SELECT Team1 , Team2, Games = COUNT(*) FROM ( SELECT Team1 = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END , Team2 = CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END FROM @t ) AS T GROUP BY Team1 , Team2