查询选择数据不会更改的行

时间:2012-06-27 12:07:25

标签: sql ms-access

我有一张高尔夫比赛表,来自必发可下载的历史数据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

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

帮助! : - )

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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