我正在尝试编写一个sql查询,显示两支球队相互比赛的频率。
Id | Team1 | Team2 | Date
1 | A | B | 25/5/11
2 | B | A | 26/5/11
3 | A | C | 27/5/11
4 | C | B | 28/5/11
5 | A | B | 28/5/11
结果应为:
A vs B => 3
A vs C => 1
C vs B => 1
将A-B和B-A计为不同是一个简单的查询。但是我无法将它们统计在一起。
有什么建议吗?
答案 0 :(得分:6)
我在分组之前使用了一个子查询来重新排序。
SELECT first_team, second_team, count(*)
FROM (
SELECT
CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END AS first_team,
CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END AS second_team
FROM table
) a
GROUP BY first_team, second_team;
答案 1 :(得分:5)
SELECT Team1, Team2, SUM(num) FROM (
SELECT Team1, Team2, COUNT(*) num
FROM table_name
GROUP BY Team1, Team2
UNION ALL
SELECT Team2, Team1, COUNT(*) num
FROM table_name
GROUP BY Team2, Team1
) combined
WHERE Team1 < Team2
GROUP BY Team1, Team2
编辑:更新以在必要时撤消团队。
注意:这比使用CASE的版本运行速度要快得多,因为它会充分利用索引。
Edit2:使用索引移动到哪里更快。
答案 2 :(得分:1)
SELECT
(CASE WHEN Team1<Team2 THEN Team1 ELSE Team2) Team1,
(CASE WHEN Team1>Team2 THEN Team1 ELSE Team2) Team2,
COUNT(*) cnt
FROM <table>
GROUP BY
(CASE WHEN Team1<Team2 THEN Team1 ELSE Team2) Team1,
(CASE WHEN Team1>Team2 THEN Team1 ELSE Team2) Team2
答案 3 :(得分:1)
实现目标的方法很少:
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,如果您使用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
以上两个都会给你相同的结果
/*
Teams Games
-------|------
A vs B 3
A vs C 1
B vs C 1
*/
以下是您可以使用的脚本:
/* TEST DATA */
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'
/* STYLE 1 */
;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
/* STYLE 2 */
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,使用它来切换列* /
/* STYLE 3 */
;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
/* STYLE 4 */
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