2015-02-11 71 views
0

很新的SQL,这里就是我 - 在一个赛季的每场比赛的所有球员基本数据库,像这样(它实际上是成千上万行):总计鲜明的组合共享一个值通过SQL

Player Points Team Date 
Johnson 20  PHI 3-5-13 
Jackson 30  PHI 3-5-13 
Wilson 9  PHI 3-5-13 
Anderson 18  DET 3-5-13 
Thomas 17  DET 3-5-13 
Coleman 21  CHI 3-6-13 
Robinson 33  CHI 3-6-13 

这就是我想要做的查询 - 列出每个游戏的每个团队的所有双人组合,并将它们总和。因此,对于上述例子,3-5-13场比赛的PHI双人组合是Johnson/Jackson,Johnson/Wilson和Jackson/Wilson。所以首先它需要在同一天为同一队的所有球员获得所有可能的2人组合。然后,我想要一份报告,将所有游戏中所有组合的总数。所以我们说约翰逊&杰克逊在25总场比赛的PHI队和约翰逊&威尔逊在13打 - 我想最后的结果为:

Player 1 Player 2 Games 
Jackson  Johnson  25 
Johnson  Wilson  13 

任何简单的方法用SQL做到这一点查询?基本上我想要得到所有在同一天在同一个球队上的两人组合,然后获得每个人的总比赛。

+0

你到目前为止试过了什么?首先,我会说你必须创建一些子查询和连接子查询,如'SELECT * FROM Players Player1 INNER JOIN Players Player2 ON Player1.Name <> Player2.Name'我可能错了,但这只是一开始....你也可以尝试在这里做一个小提琴... http://www.sqlfiddle.com/ – 2015-02-11 03:58:59

+0

你能解释这部分**约翰逊和杰克逊在PHI球队总共25场比赛中打出** – 2015-02-11 04:27:32

回答

0

这应做到:

select 
    p1.player as player1, 
    p2.player as player2, 
    sum(p1.points + p2.points) as points, 
    sum(1) as games 
from 
    games p1 join games p2 on 
    p1.player < p2.player and 
    p1.team = p2.team and 
    p1.date = p2.date 
group by 
    p1.player, 
    p2.player 

球员与大于加盟,这样你就不会得到相同的组合两次(约翰逊 - 杰克逊+杰克逊 - 约翰逊)。

+0

我认为这是在做伎俩 - 非常感谢 - 我会再试验一下,看看是否有什么东西不会像我想要的那样出现。 – 2015-02-11 04:32:53

+0

实际上是一个快速跟进 - 除了总分和总数之外,我怎样才能得到最近发生的事件(即最近的日期和团队)? – 2015-02-11 04:45:18

+0

您可以将团队添加到group by并选择,它不会更改结果,并在日期中使用max() – 2015-02-11 05:18:20

0
SELECT 
    [Player 1] = t1.Player, 
    [Player 2] = t2.Player, 
    Games = COUNT(*), 
    Points = SUM(t1.Points + t2.Points), 
    [Recent Game] = MAX(t1.date) 
FROM Temp t1 
INNER JOIN Temp t2 
    ON t2.Player > t1.Player 
    AND t2.Team = t1.Team 
    AND t2.Date = t1.Date 
GROUP BY t1.Player, t2.Player