代码之家  ›  专栏  ›  技术社区  ›  Keyslinger

SQL:单个结果行中的组计数

  •  1
  • Keyslinger  · 技术社区  · 14 年前

    当我运行1号查询时:

    SELECT id, name, COUNT(name) AS count 
      FROM markers 
     WHERE state like 'OR' 
    group by named
    

    我得到以下结果:

    id  name                count
    14  Alsea               2
    76  Applegate Valley    1
    3   Ashland             9
    64  Beaver              1
    26  Bend                1
    10  Carlton             2
    

    这很好,但我希望计数名称的每个实例都显示其各自的ID,如查询编号2的结果所示:

    SELECT id, name, COUNT(name) AS count 
      FROM markers 
    WHERE state like 'OR' 
    group by name, id
    

    结果如下:

    id  name                count
    14  Alsea               1
    28  Alsea               1
    76  Applegate Valley    1
    3   Ashland             1
    13  Ashland             1
    16  Ashland             1
    20  Ashland             1
    22  Ashland             1
    43  Ashland             1
    48  Ashland             1
    51  Ashland             1
    72  Ashland             1
    64  Beaver              1
    26  Bend                1
    10  Carlton             1
    27  Carlton             1
    

    是否可以运行一个查询,该查询将返回查询编号2中的ID和名称以及查询编号1中的相应计数,如下所示?

    id  name                count
    14  Alsea               2
    28  Alsea               2
    76  Applegate Valley    1
    3   Ashland             9
    13  Ashland             9
    16  Ashland             9
    20  Ashland             9
    22  Ashland             9
    43  Ashland             9
    48  Ashland             9
    51  Ashland             9
    72  Ashland             9
    64  Beaver              1
    26  Bend                1
    10  Carlton             2
    27  Carlton             2
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   Matt Mitchell    14 年前

    试试这个:

    SELECT id, name, 
     (SELECT COUNT(name) 
       FROM markers im 
       WHERE state like 'OR' 
       GROUP BY name 
       HAVING im.name=m.name) as count
    FROM markers m 
    WHERE state like 'OR' 
    GROUP BY name, id 
    
        2
  •  1
  •   OMG Ponies    14 年前

    你可以使用:

       SELECT t.id,
              t.name,
              COALESCE(x.cnt, 0) AS count
         FROM MARKERS t
    LEFT JOIN (SELECT m.name,
                      COUNT(m.*) AS cnt
                 FROM MARKERS m
                WHERE m.state LIKE 'OR'
             GROUP BY n.name) x ON x.name = t.name
         WHERE t.state LIKE 'OR'
      GROUP BY t.id, t.name