【问题标题】:Group By Rows Where Field is a Given Value字段为给定值的按行分组
【发布时间】:2020-12-09 14:08:55
【问题描述】:

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

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

我希望基本上对除 CAP_REFERENCE 之外的所有字段执行“分组依据”语句,但只返回一组共享相同 CAP_REFERENCE 值的唯一值(我在这些示例表中对这个分组进行了颜色编码)。

目前,我可以运行以下“分组依据”语句来删除所有字段组合重复的记录。 注意:我知道使用 group by 函数我必须 max() (或类似的)我的 CAP_REFERENCE 所以如果有多个,它只取第一个可能的值。

SELECT FACULTY_CODE, UNIT_CODE, CLASS_CODE, CAPACITY, LOCATION, NEW, max(CAP_REFERENCE)
FROM tbl
GROUP BY FACULTY_CODE, UNIT_CODE, CLASS_CODE, CAPACITY, LOCATION, NEW

得到

我能否对两行进行“分组”,以便生成的表格如下所示? (我真正需要的东西):

我考虑过可能将 CAP_REFERENCE 相同的行连接起来,并将它们全部放在一个新表中,然后执行“分组依据”,但我不知道如何再次将所有值分开。我运行这个查询的完整表有 509 条记录,所以我肯定需要标准化这个过程。

我感谢所有想法!

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

+------+------+-------+-------+---------+------+--------+
| col1 | col2 | col3  | col4  |  col5   | col6 |  col7  |
+------+------+-------+-------+---------+------+--------+
|  550 |    0 | ALERT | FULL  | OUTSIDE | NO   | ABC123 |
|  550 |    1 | ALERT | EMPTY | OUTSIDE | NO   | ABC123 |
|  550 |    0 | ALERT | FULL  | OUTSIDE | NO   | ABC456 |
|  550 |    1 | EVENT | EMPTY | OUTSIDE | NO   | ABC456 |
|  553 |    0 | ALERT | FULL  | OUTSIDE | NO   | ABC555 |
|  553 |    1 | EVENT | EMPTY | OUTSIDE | NO   | ABC555 |
|  553 |    0 | ALERT | FULL  | OUTSIDE | NO   | ABC888 |
|  553 |    1 | EVENT | EMPTY | OUTSIDE | NO   | ABC888 |
+------+------+-------+-------+---------+------+--------+

编辑 修正样本数据中的错别字,抱歉!

【问题讨论】:

  • 你能创建一个小提琴吗,dbfiddle.uk。 (我懒得输入所有数据,而且我不能复制和粘贴,因为您提供的是图像而不是格式化文本。)
  • 对真正的 sql server 感兴趣,您可以在其中使用 CTE,但访问有点棘手,您可以做的有点有限。
  • 您的示例数据中还有一个错字 - 它们都是 ABC123
  • 感谢您指出@TomC 已全部修复

标签: sql ms-access group-by


【解决方案1】:

您似乎想要过滤掉两行“较早出现”的 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;

那么这些就是你想要的参考。所以你可以使用left join:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多