【问题标题】:One select with multiples counts (very similar), possible?一个选择多个计数(非常相似),可能吗?
【发布时间】:2016-02-13 03:06:24
【问题描述】:

我有一个男人。

我有一个这样的选择:

SELECT 
    ES.id, 
    ES.nombre nombreEstacion, 
    COUNT(LE.id) Cuenta
FROM estacion ES 
    LEFT JOIN lectura LE ON ES.id = LE.idEstacion
    LEFT JOIN tipo_estacion AS TE ON TE.id=ES.idTipoEstacion
WHERE 
    ES.eliminada=0 
    AND LE.resultadoNOK=0 
    OR LE.idEstacion IS NULL
GROUP BY ES.id

ID NAMEESTATION 计数

我想用这个外观做一个选择: ID NAME COUNT1 COUNT2 COUNT3 在同一个选择中。

这些计数具有相同的结构。它们只有一个区别。

count1 is when  (WHERE LE.resultadoNOK=0)
count2 is when  (WHERE LE.resultadoNOK=1)
count3 is when  (WHERE LE.resultadoNOK=3)

有些人告诉我解决方案是使用这样的东西: 计数(LE.id)昆塔, SUM(IF(X,X,X) COUNT2, SUM(IF(X,X,X) COUNT3

但我不明白这个结构,我不明白我必须在“IF”中写什么值。

我用“CASE”搜索另一种可能性,买我也不明白

谁能解释一下这是怎么回事?

谢谢大家!! :)

【问题讨论】:

  • 你到底在用什么:sql server 还是 mysql?

标签: sql sql-server mysqli mysql-workbench bdd


【解决方案1】:

当然,您可以使用 SUM 和 case 表达式来做到这一点。

SELECT 
    ES.id, 
    ES.nombre nombreEstacion, 
    SUM(case when LE.resultadoNOK = 0 then 1 end) as CuentaUno,
    SUM(case when LE.resultadoNOK = 1 then 1 end) as CuentaDos,
    SUM(case when LE.resultadoNOK = 2 then 1 end) as CuentaTres
FROM estacion ES 
    LEFT JOIN lectura LE ON ES.id = LE.idEstacion
    LEFT JOIN tipo_estacion AS TE ON TE.id=ES.idTipoEstacion
WHERE 
    ES.eliminada=0 
    AND LE.idEstacion IS NULL
GROUP BY ES.id
    , ES.nombre

【讨论】:

  • 哦,谢谢!明天我尝尝!但这两种方式是一样的吗?你还有一个家伙。代码有什么区别:GROUP BY ES.id(就像我一样)或 GROUP BY ES.id, ES.nombre 改变了什么?
  • 因为您不能仅按 eES.id 分组,除非 nombre 也在聚合中。另请注意,我删除了将结果限制为仅显示 resultadoNOK = 0 的行的 where 谓词?如果您想显示多个值,这是必需的。
【解决方案2】:

我会使用这样的 CASE 语句:

SELECT 
    ES.id, 
    ES.nombre nombreEstacion, 
    COUNT(LE.id) Cuenta,
    SUM(CASE WHEN LE.resultadoNOK = 0 THEN 1 ELSE 0 END) AS COUNT1,
    SUM(CASE WHEN LE.resultadoNOK = 1 THEN 1 ELSE 0 END) AS COUNT2,
    SUM(CASE WHEN LE.resultadoNOK = 3 THEN 1 ELSE 0 END) AS COUNT3
FROM estacion ES 
    LEFT JOIN lectura LE ON ES.id = LE.idEstacion
    LEFT JOIN tipo_estacion AS TE ON TE.id=ES.idTipoEstacion
WHERE 
    ES.eliminada=0 
    AND LE.resultadoNOK=0 
    OR LE.idEstacion IS NULL
GROUP BY ES.id

【讨论】:

  • 哦,谢谢!明天我尝尝!但这两种方式是一样的吗?你还有一个家伙。代码有什么区别:GROUP BY ES.id(就像我一样)或 GROUP BY ES.id, ES.nombre 改变了什么?
  • 我在 Group By 中没有注意到这一点。您需要在 Group By 中包含 ES.nombre,因为它没有聚合。
  • 没有工作:(((我测试了你的解决方案,但有很多寄存器为空。我用解决方案“LE.resultadoNOK = 0 然后 1 结束时的情况)”但我认为它错了。
  • 如果您的 **resultadoNOK 可以为 NULL,如果您不想计算 NULL,我会使用 SUM(CASE WHEN ISNULL(LE.resultadoNOK, -1) = 0 THEN 1 ELSE 0 END)。这会将 NULL 值转换为 -1,因此它不匹配。
猜你喜欢
  • 2021-10-04
  • 2020-05-04
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多