计算mysql中分组行的数量

alp*_*phy 49 mysql sql count

在表xyz中,我有一行称为组件和一个labref行,它具有labref编号,如下所示

表xyz

labref             component
NDQA201303001          a
NDQA201303001          a
NDQA201303001          a
NDQA201303001          a
NDQA201303001          b
NDQA201303001          b
NDQA201303001          b
NDQA201303001          b
NDQA201303001          c
NDQA201303001          c
NDQA201303001          c
NDQA201303001          c
Run Code Online (Sandbox Code Playgroud)

我想对组件进行分组,然后计算返回的行数等于3,我编写了下面的SQL查询,但它没有帮助实现我的目标,而是为每个组件返回4

SELECT DISTINCT component, COUNT( component ) 
FROM `xyz`
WHERE labref = 'NDQA201303001'
GROUP BY component
Run Code Online (Sandbox Code Playgroud)

查询返回

表xyz

labref         component   COUNT(component)       
NDQA201303001   a           4
NDQA201303001   b           4
NDQA201303001   c           4
Run Code Online (Sandbox Code Playgroud)

我现在想要实现的是,从上面的结果中,行被计数,并返回3作为行数,任何解决方法是值得赞赏的

him*_*056 106

在没有子查询的情况下尝试这个简单的查询:

SELECT COUNT(DISTINCT component) AS TotalRows
FROM xyz
WHERE labref = 'NDQA201303001';
Run Code Online (Sandbox Code Playgroud)

看到这个SQLFiddle

  • 如果您没有"GROUP BY",这将有效.如果查询具有"分组依据",则所有行都将为1. (6认同)
  • 当然这是最好的解决方案,因为它不需要子查询. (3认同)
  • @ JoelEnanodJr,Bala-您不会在此答案中使用“分组依据”;此答案是一种*替代*方法,在查询中不需要(也不容忍)“分组依据”。OP仅将“分组依据”用作“尝试”以获得他们所需的答案。将“分组依据”与“计数(不同)”组合起来是没有意义的;从查询中删除“分组依据”。 (3认同)
  • @JohnySkovdal - 你已经做了一个小提琴来回答一个不同的问题,所以说这个答案"不起作用"是不正确的.正如您的小提示所示,此答案正确报告了不同值的数量. (2认同)

Ksh*_*tij 40

你需要做 -

SELECT
    COUNT(*)
FROM
    (
        SELECT
            DISTINCT component
        FROM
            `multiple_sample_assay_abc`
        WHERE
            labref = 'NDQA201303001'
    ) AS DerivedTableAlias
Run Code Online (Sandbox Code Playgroud)

您也可避免子查询通过@ hims056的建议在这里

  • 关闭括号后添加别名. (11认同)
  • hims056'解决方案是更好的解决方案 - 如果你能够,请避免使用subquerys (2认同)
  • 给出此答案的原因是,当您需要Have子句时,它将起作用。[下面的答案](http://stackoverflow.com/a/16584882/1369235)依赖于能够在没有Have子句的情况下重写查询。 (2认同)

noj*_*tsi 12

我找到了解决方案。因此,如果您想计算组的数量,而不是每个组中元素的数量,并向结果表中的每个组记录返回重复值,则应该在计数函数上使用OVER()子句。

因此,例如上面的解决方案是

SELECT component, COUNT(*) OVER() as number_of_components FROM `xyz` 
WHERE labref = 'NDQA201303001' 
GROUP BY component
Run Code Online (Sandbox Code Playgroud)

我想这适用于任何使用 GROUP BY 的查询,附加信息,请检查上面的链接。

  • 这是正确的做法。即使使用“limit x”也可以工作。 (2认同)