簡體   English   中英

當我按某些列分組時如何計算行數和列數?

[英]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

我的問題是收集行數和重量總和(比索)。 查詢返回顯示別名 total_lote 與 NULL 的任何行。

我編輯了代碼。 對不起。 這是正確的查詢。 它將 null 返回給別名total_lote

謝謝大家。

代替六個單獨的子查詢,您可以使用一個帶有條件聚合的查詢並將其作為派生表放入 -

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

我無法對此進行測試或提供小提琴,因為您沒有包含任何示例數據或預期的 output。 我懷疑內部和外部查詢可以組合但不能確定,因為您沒有在您的問題中包含任何支持信息,特別是fornecedoresbois之間的關系。

PS你真的應該取消連接並在你的客戶端應用程序中執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM