SQL根据值选择唯一

时间:2013-01-13 17:57:03

标签: sql ms-access

表:

Name | Value | Prize
Race1   32      5
Race1   22      5
Race1   30      5
Race2   11      5
Race2   12      5
Race2   31      5

我要查询的内容,当我定义Value 20+时,将根据Value更高的结果选择UNIQUE比赛(Race1,Race2)到我的结果。奖金应该总结。

所以当我做metaquery时:select sum(Prize) biggestValueUniqueRaces where value > -20 我明白了:

查询返回:

Prize
  10

考虑到这两行:

Name | Value | Prize
Race1   32      5
Race2   31      5

2 个答案:

答案 0 :(得分:2)

首先必须确定所有种族,其值等于具有相同名称的种族的最大值。

SELECT
    [r1].[Name],
    [r1].[Value],
    [r1].[Prize]
  FROM [Races] [r1]
  WHERE [r1].[Value] > 20
    AND [r1].[Value] = 
      (SELECT MAX([r2].[Value])
       FROM [Races] [r2]
       WHERE [r2].[Name] = [r1].[Name])

这可以为多个种族提供相同的名称,价值和奖品。所以把他们分组:

SELECT
    [r1].[Name],
    [r1].[Value],
    [r1].[Prize]
  FROM [Races] [r1]
  WHERE [r1].[Value] > 20
    AND [r1].[Value] = 
      (SELECT MAX([r2].[Value])
       FROM [Races] [r2]
       WHERE [r2].[Name] = [r1].[Name])
  GROUP BY 
    [r1].[Name],
    [r1].[Value],
    [r1].[Prize]

然后总结奖品:

SELECT
  SUM([sub].[Prize]) AS [TotalPrizes],
  COUNT(*) AS [NumberOfRaces]
FROM
(
  SELECT
    [r1].[Name],
    [r1].[Value],
    [r1].[Prize]
  FROM [Races] [r1]
  WHERE [r1].[Value] > 20
    AND [r1].[Value] = 
      (SELECT MAX([r2].[Value])
       FROM [Races] [r2]
       WHERE [r2].[Name] = [r1].[Name])
  GROUP BY 
    [r1].[Name],
    [r1].[Value],
    [r1].[Prize]
) AS [sub]

Here is a Fiddle。 (我将服务器类型设置为MS SQL 2008,但我不认为这种情况/查询会出现问题。)

答案 1 :(得分:1)

编辑重新评论

SELECT Sum(Races.Prize) As Total
FROM Races INNER JOIN (SELECT r.[Name], Max(r.[Value]) AS MaxOfValue
FROM Races r WHERE [Value]>20
GROUP BY r.[Name])  AS q 
ON (Races.Value = q.MaxOfValue) AND (Races.Name = q.Name);

SELECT SUM(races.prize) AS SP
FROM   races
WHERE  races.id IN (
    SELECT id
    FROM   races r
    WHERE  r.name = races.name
    AND VALUE = (
       SELECT Max(VALUE)
       FROM   races s
       WHERE  s.[name] = r.name
       AND VALUE > 20 ))