当我按某些列分组时如何计算行数和求和列?

How to count rows and sum columns when I group by some columns?

看似容易,实则不然。请阅读查询:

SELECT 
    b.d_comp, b.fk_frnc, 
    CONCAT(
        DATE_FORMAT(b.d_comp, "%d/%m/%Y"), 
        " - ", f.nome
    ) AS alias, 
    FORMAT(SUM(b.vlr), 2, 'de_DE') AS vlr, 
    
    # ACRÉSCIMO DE SOMAS, CASO TOTAL POR LOTE ESTEJA HABILITADO #
    CONCAT(
        '<span class="fw-bldr">Fêmeas</span>:<br>Quantidade | Peso<br>Adultas:',
        # QTD #
        (
            SELECT COUNT(*) 
            FROM bois AS b2
            WHERE 
                b2.genero = 'F' AND
                b2.d_comp = b.d_comp AND
                b2.fk_frnc = b.fk_frnc AND
                b2.novilho IS FALSE
        ),
        ' | ',
        # PESO #
        (
            SELECT SUM(b2.peso) 
            FROM bois AS b2
            WHERE 
                b2.genero = 'F' AND
                b2.d_comp = b.d_comp AND
                b2.fk_frnc = b.fk_frnc AND
                b2.novilho IS FALSE
        ),
        '<br>Novilhas: ',
        (
            SELECT COUNT(*)
            FROM bois AS b2
            WHERE
                b2.genero = 'F' AND
                b2.d_comp = b.d_comp AND
                b2.fk_frnc = b.fk_frnc AND
                b2.novilho IS TRUE
        ),
        ' | ',
        (
            SELECT SUM(b2.peso)
            FROM bois AS b2
            WHERE
                b2.genero = 'F' AND
                b2.d_comp = b.d_comp AND
                b2.fk_frnc = b.fk_frnc AND
                b2.novilho IS TRUE
        ),
        '<br>Total: ',
        (   
            SELECT COUNT(*)
            FROM bois AS b2
            WHERE
                b2.genero = 'F' AND
                b2.d_comp = b.d_comp AND
                b2.fk_frnc = b.fk_frnc
        ),
        ' | ',
        (
            SELECT SUM(b2.peso)
            FROM bois AS b2
            WHERE
                b2.genero = 'F' AND
                b2.d_comp = b.d_comp AND
                b2.fk_frnc = b.fk_frnc
        )
    ) AS total_lote
FROM 
    bois AS b INNER JOIN 
    fornecedores AS f 
WHERE 
    b.fk_frnc = f.id
GROUP BY b.d_comp, b.fk_frnc

我的问题是收集行数和重量总和(比索)。 Return 的查询显示别名 total_lote,任何行都为 NULL。

我编辑了代码。对不起。这是正确的查询。它 returns 空别名 total_lote.

谢谢大家。

您可以使用一个带有条件聚合的子查询,而不是六个单独的子查询,并将其作为派生的 table -

SELECT
    d_comp,
    fk_frnc,
    SUM(IF(novilho IS FALSE, 1, 0)) AS col1,
    SUM(IF(novilho IS FALSE, peso, 0)) AS col2,
    SUM(IF(novilho IS TRUE, 1, 0)) AS col3,
    SUM(IF(novilho IS TRUE, peso, 0)) AS col4,
    COUNT(*) AS col5,
    SUM(peso) AS col6
FROM bois
WHERE genero = 'F'
GROUP BY d_comp, fk_frnc

所以完整的查询将是 -

SELECT 
    b.d_comp,
    b.fk_frnc,
    CONCAT( DATE_FORMAT(b.d_comp, "%d/%m/%Y"), " - ", f.nome) AS alias,
    FORMAT(SUM(b.vlr), 2, 'de_DE') AS vlr,
    
    /* ACRÉSCIMO DE SOMAS, CASO TOTAL POR LOTE ESTEJA HABILITADO */
    CONCAT(
        '<span class="fw-bldr">Fêmeas</span>:<br>Quantidade | Peso<br>Adultas:', /* QTD */ b2.col1, ' | ', /* PESO */ b2.col2,
        '<br>Novilhas: ', b2.col3, ' | ', b2.col4,
        '<br>Total: ', b2.col5, ' | ', b2.col6
    ) AS total_lote
FROM bois AS b
INNER JOIN (

    SELECT
        d_comp,
        fk_frnc,
        SUM(IF(novilho IS FALSE, 1, 0)) AS col1,
        SUM(IF(novilho IS FALSE, peso, 0)) AS col2,
        SUM(IF(novilho IS TRUE, 1, 0)) AS col3,
        SUM(IF(novilho IS TRUE, peso, 0)) AS col4,
        COUNT(*) AS col5,
        SUM(peso) AS col6
    FROM bois
    WHERE genero = 'F'
    GROUP BY d_comp, fk_frnc

) b2 ON b2.d_comp = b.d_comp AND b2.fk_frnc = b.fk_frnc
INNER JOIN fornecedores AS f
    ON b.fk_frnc = f.id    
GROUP BY b.d_comp, b.fk_frnc

您可能可以通过将 where 子句中的条件添加到聚合函数中使用的条件来组合内部查询和外部查询,但我们无法确定,因为您没有包含任何支持信息,尤其是 [ 之间的关系=13=] AND bois,在你的问题中。

SELECT
    b.d_comp,
    b.fk_frnc,
    CONCAT( DATE_FORMAT(b.d_comp, "%d/%m/%Y"), " - ", f.nome) AS alias,
    FORMAT(SUM(b.vlr), 2, 'de_DE') AS vlr,
    
    /* ACRÉSCIMO DE SOMAS, CASO TOTAL POR LOTE ESTEJA HABILITADO */
    CONCAT(
        '<span class="fw-bldr">Fêmeas</span>:<br>Quantidade | Peso<br>Adultas:',
        SUM(IF(b.genero = 'F' AND b.novilho IS FALSE, 1, 0)),
        ' | ',
        SUM(IF(b.genero = 'F' AND b.novilho IS FALSE, b.peso, 0)),
        '<br>Novilhas: ',
        SUM(IF(b.genero = 'F' AND b.novilho IS TRUE, 1, 0)),
        ' | ',
        SUM(IF(b.genero = 'F' AND b.novilho IS TRUE, b.peso, 0)),
        '<br>Total: ',
        SUM(IF(b.genero = 'F', 1, 0)),
        ' | ',
        SUM(IF(b.genero = 'F', b.peso, 0))
    ) AS total_lote
FROM bois b
INNER JOIN fornecedores f
    ON b.fk_frnc = f.id    
GROUP BY b.d_comp, b.fk_frnc

我无法对此进行测试或提供 fiddle,因为您没有包含任何样本数据或预期的输出。

P.S。您真的应该取消连接并在您的客户端应用程序中执行此操作。