4

我有一张从 Betfair 可下载的 CSV 历史数据文件中获取的高尔夫比赛表。它们看起来像这样:

event         selection
S. Garcia     Garcia
S. Garcia     Woods
P. Mickelson  Mickelson
P. Mickelson  Donald
E. Els        McIlroy
E. Els        Els

我需要一个提供以下输出的查询:

event         selection_a  selection_b
S. Garcia     Garcia       Woods
S. Garcia     Woods        Garcia
P. Mickelson  Mickelson    Donald
P. Mickelson  Donald       Mickelson
E. Els        McIlroy      Els
E. Els        Els          McIlroy

总而言之,赛事名称只是比赛中的一名球员。在每场比赛中会有两名球员,我如何编写一个查询来识别加西亚打伍兹,米克尔森打唐纳德,埃尔斯打麦克罗伊?

帮助!:-)

4

2 回答 2

5
SELECT
    g.event,
    Min(g.selection) AS selection_a,
    Max(g.selection) AS selection_b
FROM Golf_matches AS g
GROUP BY g.event
UNION ALL
SELECT
    g.event,
    Max(g.selection),
    Min(g.selection)
FROM Golf_matches AS g
GROUP BY g.event
ORDER BY 1, 2;
于 2012-06-27T13:42:16.373 回答
3

相当肯定一些 SQL Ninja 会出现并指出这种方法有多糟糕,但我只是在玩弄它。到目前为止我的方法是(包括我的声明,但在你的情况下只是忽略它并用你的表名替换@Match)

DECLARE @Match TABLE (
    eventName NVARCHAR(MAX),
    selection NVARCHAR(MAX)
)

INSERT INTO @Match(eventName, selection)
VALUES ('S. Garcia', 'Garcia'),
       ('S. Garcia', 'Woods'),
       ('P. Mickelson', 'Mickelson'),
       ('P. Mickelson', 'Donald'),
       ('E. Els', 'McIlroy'),
       ('E. Els', 'Els')

SELECT M1.eventName, M1.selection AS SelectionA, M2.selection AS SelectionB 
    FROM @Match M1 
        INNER JOIN @Match M2 
          ON M1.eventName = M2.eventName
WHERE M1.selection <> M2.selection
于 2012-06-27T13:09:03.483 回答