【问题标题】:Access SQL COUNT records grouped by two fields访问按两个字段分组的 SQL COUNT 记录
【发布时间】:2015-10-11 15:42:28
【问题描述】:

表1

ID1  LETTER
1    A
1    B
2    R
2    S
2    T
3    Z

表2

ID1  NAME
1    Pete
2    Andy
3    Mary

Access 中的 SQL 命令:

SELECT name, letter
FROM table1 
INNER JOIN table2 ON table1.ID1 = table2.ID1
GROUP BY name, letter
HAVING COUNT(*) > 2;

最后,我创建了一个查询来生成这个:

NAME  LETTER
Pete  A
Pete  B
Andy  R
Andy  S
Andy  T
Mary  Z

我正在尝试生成仅提供那些具有两个以上条目的个人以及相关字母的输出。所以类似于以下内容:

NAME  FIELD
Andy  R
Andy  S
Andy  T

但是当我按名称和字段分组时,每个唯一组合的计数仅为 1,因此 SQL 在运行时不输出任何条目。

如果我尝试单独按名称进行 GROUP BY,访问会告诉我我的查询不包含指定的表达式“字母”作为聚合函数的一部分。

【问题讨论】:

    标签: sql ms-access count group-by inner-join


    【解决方案1】:

    一种方法是只对第一个表中的 id 进行聚合并加入它:

    SELECT table2.name, table1.letter
    FROM (table1 INNER JOIN
          table2 
          ON table1.ID1 = t2.ID1
         ) INNER JOIN
         (SELECT id1, COUNT(*) as cnt
          FROM table1
          GROUP BY id1
         ) as t1cnt
         ON t1.ID1 = t1cnt.ID1
    WHERE t1cnt.cnt > 2
    

    【讨论】:

      【解决方案2】:

      使用CTE先分组再join得到字母值如下:

      with CTE(name, ID1)
      as(
      SELECT name, table1.ID1 FROM table1 INNER JOIN table2 ON table1.ID1 = table2.ID1       GROUP BY name HAVING COUNT( * ) > 2
      )
      SELECT name, letter
      FROM cte
      INNER JOIN table2 ON cte.ID1 = table2.ID1
      

      【讨论】:

        【解决方案3】:

        这样的事情应该可以工作:

        select name, letter
        from table1
          inner join table2 on table1.id = table2.id
          inner join
            (select id
             from table1
             group by id
             having count(*) > 2) as t1 on t1.id = table1.id;
        

        【讨论】:

          猜你喜欢
          • 2017-04-13
          • 2014-11-28
          • 1970-01-01
          • 2020-04-08
          • 1970-01-01
          • 1970-01-01
          • 2020-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多