【问题标题】:Group by to show unique fields分组以显示唯一字段
【发布时间】:2015-04-27 16:40:48
【问题描述】:

目前,我的代码如下:

SELECT Volunteer.VolunteerID, Volunteer.LastName, Volunteer.FirstName, Observations.VolunteerID, Roost.RoostID, Roost.UTME, Roost.UTMN, Roost.DecimalDegrees, Observations.Date, Location.LocationName, Location.Address, Town.Town
FROM (((Volunteer INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
ORDER BY Volunteer.LastName, Volunteer.FirstName;

目前我的表格的一部分如下所示:

    Observations.VolunteerID | Observations.LocationID | Date

    Bob                      | Main St                 | 2015-01-01  
    Bob                      | Main St                 | 2015-02-02
    Sally                    | Fox St                  | 2015-02-02
    Dave                     | Long St                 | 2015-02-02
    Dave                     | Taylor St               | 2015-02-05
    Lindsay                  | New St                  | 2015-02-01
    Lindsay                  | New St                  | 2015-02-08
    Lindsay                  | Ray St                  | 2015-02-10
    Lindsay                  | Main St                 | 2015-02-25
    Lindsay                  | Taylor St               | 2015-02-31

但是,我想添加一个由 VolunteerIDLocationID 分组的 GROUP BY 语句(我认为),以便获得以下输出。我想知道志愿者去过的每个地点,如果他们多次访问同一个地点,我想查看最近的日期。我如何将它合并到我的原始代码中?

    Observations.VolunteerID | Observations.LocationID | Date
    Bob                      | Main St                 | 2015-02-02
    Sally                    | Fox St                  | 2015-02-02
    Dave                     | Long St                 | 2015-02-02
    Dave                     | Taylor St               | 2015-02-05
    Lindsay                  | New St                  | 2015-02-08
    Lindsay                  | Ray St                  | 2015-02-10
    Lindsay                  | Main St                 | 2015-02-25
    Lindsay                  | Taylor St               | 2015-02-31

更新了代码,但仍然出现语法错误(查询表达式“Volunteer.FirstName GROUP BY Observations.VolunteerID”中缺少运算符。

SELECT Volunteer.VolunteerID, Volunteer.LastName, Volunteer.FirstName, Observations.VolunteerID, Roost.RoostID, Roost.UTME, Roost.UTMN, Roost.DecimalDegrees, Max([Observations.Date]), Location.LocationName, Location.Address, Town.Town
FROM (((Volunteer INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
ORDER BY Volunteer.LastName, Volunteer.FirstName
GROUP BY Observations.VolunteerID, Observations.LocationID;

【问题讨论】:

  • 您更新的查询错误。再看我的回答。您必须聚合不属于GROUP BY 子句的每一列。
  • ORDER BY 子句放在GROUP BY 之后。我怀疑这将解决您当前的错误。然后,由于@ConsiderMe 描述的问题,您将面临一个不同的错误。

标签: sql ms-access group-by


【解决方案1】:

max 加上group by 子句似乎就足够了:

select Observations.VolunteerID, Observations.LocationID, max([Date])
from <...>
group by Observations.VolunteerID, Observations.LocationID

【讨论】:

    【解决方案2】:

    您需要在日期上使用GROUP BY 和聚合函数MAX()

    SELECT VolunteerID, LocationID, MAX(Date)
    FROM(
    SELECT 
      Volunteer.VolunteerID, 
      Volunteer.LastName, 
      Volunteer.FirstName, 
      Observations.VolunteerID, 
      Roost.RoostID, 
      Roost.UTME, 
      Roost.UTMN, 
      Roost.DecimalDegrees, 
      Observations.Date, 
      Location.LocationName, 
      Location.Address, 
      Town.Town
    FROM 
      (((Volunteer 
      INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
      LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
      LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
      LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
    ORDER BY Volunteer.LastName, Volunteer.FirstName
    ) foo
    GROUP BY VolunteerID, LocationID
    

    【讨论】:

    • 感谢您的帮助...我越来越近了,但仍然出现错误:
    • 错误是什么?请更新您的问题,不要在评论中发布此问题。
    • 查询表达式“Volunteer.FirstName GROUP BY Observations.VolunteerID”中的语法错误(缺少运算符)。
    • 请发布您正在执行的代码以及您的问题中的错误。
    • 用人们建议的新代码更新了我的问题。
    【解决方案3】:

    ORDER BY 子句放在GROUP BY 之后。

    Max([Observations.Date]) 更改为Max(Observations.Date)

    SELECT 列表中不是聚合表达式的任何字段表达式添加到您的GROUP BY

    SELECT
        Volunteer.VolunteerID,
        Volunteer.LastName,
        Volunteer.FirstName,
        Observations.VolunteerID,
        Roost.RoostID,
        Roost.UTME,
        Roost.UTMN,
        Roost.DecimalDegrees,
        Max(Observations.Date) AS latest_observation,
        Location.LocationName,
        Location.Address,
        Town.Town
    FROM (((Volunteer INNER JOIN Observations ON Volunteer.[VolunteerID]= Observations.[VolunteeriD])
        LEFT JOIN Roost ON Roost.[RoostID]= Observations.[RoostID])
        LEFT JOIN Location ON Location.[LocationID]= Roost.[LocationID])
        LEFT JOIN Town ON Location.[TownID]= Town.[TownID]
    GROUP BY
        Volunteer.VolunteerID,
        Volunteer.LastName,
        Volunteer.FirstName,
        Observations.VolunteerID,
        Roost.RoostID,
        Roost.UTME,
        Roost.UTMN,
        Roost.DecimalDegrees,
        Location.LocationName,
        Location.Address,
        Town.Town
    ORDER BY Volunteer.LastName, Volunteer.FirstName;
    

    但是我不确定该分组是否合适。在这个问题中,您想对 Observations.VolunteerIDObservations.LocationID 进行分组。这个较大的GROUP BY 可能不会给您相同的结果。

    如果是这种情况,您可以对SELECT 字段使用聚合函数,然后从GROUP BY 中删除该字段。比如……

    SELECT Max(Volunteer.LastName)
    

    假设 LastName 对于给定的 VolunteerID 始终相同,Max(Volunteer.LastName) 将为您提供相同的值。

    【讨论】:

    • 感谢大家的帮助。 HansUp,您的代码运行良好......仍在弄清楚组织,所以当我有更多知识时会尝试考虑我的代码。
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多