Sql 按行分组,其中字段为给定值

Sql 按行分组,其中字段为给定值,sql,ms-access,group-by,Sql,Ms Access,Group By,我目前正在MS Access中运行查询,但使用SQL而不是“设计窗口”进行查询。我仍在学习,因此非常感谢您的帮助 我有下表(我对此进行了颜色编码以提供帮助): 我希望对除CAP_引用之外的所有字段执行“Group By”语句,但只返回共享相同CAP_引用值的唯一值集(我在这些示例表中对该分组进行了颜色编码) 目前,我可以运行下面的“groupby”语句来删除具有所有字段重复组合的记录。注意:我知道使用group by函数时,我必须将CAP_引用设置为max()(或类似值),因此只有在存在多个引

我目前正在MS Access中运行查询,但使用SQL而不是“设计窗口”进行查询。我仍在学习,因此非常感谢您的帮助

有下表(我对此进行了颜色编码以提供帮助):

我希望对除CAP_引用之外的所有字段执行“Group By”语句,但只返回共享相同CAP_引用值的唯一值集(我在这些示例表中对该分组进行了颜色编码)

目前,我可以运行下面的“groupby”语句来删除具有所有字段重复组合的记录。注意:我知道使用group by函数时,我必须将CAP_引用设置为max()(或类似值),因此只有在存在多个引用时才取第一个可能的值

而我
得到了:

我是否能够按两行“分组”,以便生成的表将改为如下所示?(我真正需要的是什么):

我曾考虑过可能将CAP_引用相同的行连接起来,然后将它们全部放在一个新表中,然后执行“分组依据”,但这样我就不知道如何再次将所有值分离出来。我正在运行此查询的完整表有509条记录,因此我肯定需要对流程进行标准化

我欣赏所有的想法

在这里编辑原始表格,这样你们就不必键入:)

编辑
修正了样本数据中的错误,抱歉

您似乎希望过滤掉两行“出现较早”的成对cap引用值,也就是说,在所有其他行中都有重复的cap引用值

如果此解释正确,则可以使用聚合获取cap引用:

select t.CAP_REFERENCE
from tbl as t
where exists (select 1
              from tbl as t2
              where t2.FACULTY_CODE = t.FACULTY_CODE and
                    . . . and -- all the other conditions
                    t2.CAP_REFERENCE < t.CAP_REFERENCE
             )
group by t.cap_reference
having count(*) = 2;

您似乎希望过滤掉两行“出现较早”的cap引用值对——也就是说,在所有其他行中都有重复项

如果此解释正确,则可以使用聚合获取cap引用:

select t.CAP_REFERENCE
from tbl as t
where exists (select 1
              from tbl as t2
              where t2.FACULTY_CODE = t.FACULTY_CODE and
                    . . . and -- all the other conditions
                    t2.CAP_REFERENCE < t.CAP_REFERENCE
             )
group by t.cap_reference
having count(*) = 2;

你能做一把小提琴吗。(我懒得键入所有这些数据,而且我不能进行复制和通过,因为您提供的是图像而不是格式化文本。)对真正的sql server很感兴趣,您可以使用CTE,但在访问方面有点棘手,这对您的操作有点限制。您的示例数据中也有一个输入错误-它们都是abc123感谢您指出@TomC all fixed可以创建一个fiddle。(我懒得键入所有这些数据,而且我不能复制和通过,因为你提供了图像而不是格式化文本。)对真正的sql server很感兴趣,在那里你可以使用CTE,但在访问方面有点棘手,这限制了你能做的。你的示例数据中也有一个输入错误-它们都是ABC123感谢你指出@TomC all fixed
select t.CAP_REFERENCE
from tbl as t
where exists (select 1
              from tbl as t2
              where t2.FACULTY_CODE = t.FACULTY_CODE and
                    . . . and -- all the other conditions
                    t2.CAP_REFERENCE < t.CAP_REFERENCE
             )
group by t.cap_reference
having count(*) = 2;
select t.*
from tbl as t left join
     (select t.CAP_REFERENCE
      from tbl as t
      where exists (select 1
                    from tbl as t2
                    where t2.FACULTY_CODE = t.FACULTY_CODE and
                          . . . and -- all the other conditions
                          t2.CAP_REFERENCE < t.CAP_REFERENCE
                   )
      group by t.cap_reference
      having count(*) = 2
     ) as tt
     on tt.CAP_REFERENCE = t.CAP_REFERENCE
where tt.CAP_REFERENCE is null;