[英]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。 我懷疑內部和外部查詢可以組合但不能確定,因為您沒有在您的問題中包含任何支持信息,特別是fornecedores
和bois
之間的關系。
PS你真的應該取消連接並在你的客戶端應用程序中執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.