Sql 按行分组,其中字段为给定值
我目前正在MS Access中运行查询,但使用SQL而不是“设计窗口”进行查询。我仍在学习,因此非常感谢您的帮助 我有下表(我对此进行了颜色编码以提供帮助): 我希望对除CAP_引用之外的所有字段执行“Group By”语句,但只返回共享相同CAP_引用值的唯一值集(我在这些示例表中对该分组进行了颜色编码) 目前,我可以运行下面的“groupby”语句来删除具有所有字段重复组合的记录。注意:我知道使用group by函数时,我必须将CAP_引用设置为max()(或类似值),因此只有在存在多个引用时才取第一个可能的值 而我得到了: 我是否能够按两行“分组”,以便生成的表将改为如下所示?(我真正需要的是什么): 我曾考虑过可能将CAP_引用相同的行连接起来,然后将它们全部放在一个新表中,然后执行“分组依据”,但这样我就不知道如何再次将所有值分离出来。我正在运行此查询的完整表有509条记录,因此我肯定需要对流程进行标准化 我欣赏所有的想法 在这里编辑原始表格,这样你们就不必键入:) 编辑Sql 按行分组,其中字段为给定值,sql,ms-access,group-by,Sql,Ms Access,Group By,我目前正在MS Access中运行查询,但使用SQL而不是“设计窗口”进行查询。我仍在学习,因此非常感谢您的帮助 我有下表(我对此进行了颜色编码以提供帮助): 我希望对除CAP_引用之外的所有字段执行“Group By”语句,但只返回共享相同CAP_引用值的唯一值集(我在这些示例表中对该分组进行了颜色编码) 目前,我可以运行下面的“groupby”语句来删除具有所有字段重复组合的记录。注意:我知道使用group by函数时,我必须将CAP_引用设置为max()(或类似值),因此只有在存在多个引
修正了样本数据中的错误,抱歉 您似乎希望过滤掉两行“出现较早”的成对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;