2010-01-29 18 views
8

Estoy usando la siguiente declaración y obtengo casi todo lo que necesito. Además, me gustaría obtener la SUMA de todos los resultados row_total.MySQL - ¿Cómo obtengo SUMA de un COUNT de un campo?

SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
SUM(c.amount) as row_total 
FROM campaigns c 
JOIN campaign_codes cc 
LEFT JOIN partners p on p.id = 4 
WHERE c.partner_id = 4 AND cc.status = 0 AND c.id = cc.campaign_id 
GROUP BY c.id 
ORDER BY campaign_amount ASC 

Y aquí es un resultado ejemplo, con la última columna es la columna quiero añadir juntos:

1 10.00 30 992 24 9920.00 
    3 25.00 30 995 290 24875.00 
    16 50.00 30 988 335 49400.00 
    17 100.00 30 1000 335 100000.00 
+0

¿Desea ambos datos? ¿Se muestra en su ejemplo * y * la suma de los valores de la última columna? En caso afirmativo, ¿no puede sumar los valores en la capa de aplicación? –

+0

Sí, deseo tanto los datos que visualicé Y la suma de los valores del último col. Podría agregarlo en el controlador o en la capa de visualización, pero pensé que era el más adecuado para el Modelo. – k00k

Respuesta

11

para obtener la suma en ejecución:

SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
     COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
     SUM(c.amount) as row_total, @r := @r + SUM(c.amount) AS running_sum 
FROM (
     SELECT @r := 0 
     ) vars, 
     campaign c, … 

Para obtener el total general (y todos los otros agregados) como un registro adicional:

SELECT * 
FROM (
     SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
       COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
       SUM(c.amount) as row_total 
     FROM campaign c, … 
     GROUP BY 
       c.id WITH ROLLUP 
     ) q 
ORDER BY 
     campaign_amount ASC 

para obtener la suma total en una campo adicional:

 SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
       COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
       SUM(c.amount) as row_total, 
       (
       SELECT SUM(c.amount) 
       FROM campaign c, … 
       -- the same but without the GROUP BY and ORDER BY clauses. 
       ) 
     FROM campaign c, … 
     GROUP BY 
       c.id 
     ORDER BY 
       campaign_amount ASC 
+0

+1, ¡son algunos trucos útiles que tienes ahí! –

+0

Quassnoi: esto es bastante astuto. Y funciona bien si dejo de ORDER BY, de lo contrario, ORDER BY arroja un error de: Uso incorrecto de CUBE/ROLLUP y ORDER BY – k00k

+0

@ k00k: claro, se olvidó de eso. Solo envuélvelo en una consulta anidada. Actualizaré la publicación. – Quassnoi

4

encapsular su consulta como:

SELECT SUM([row_total]) FROM (
Your query 
) Source 

A partir de los comentarios de abajo, usted podría intentar ...

Your Query 
UNION ALL 
SELECT '', '', '', '', '', SUM([row_total]) FROM (
Your query 
) Source 

La unión de todos le permitirá agregar una fila adicional al conjunto de resultados que le dará una 'fila total'. Puede cambiar los campos vacíos (las comillas simples) para que coincidan con sus tipos de datos o asignarles valores especiales que representarán su fila total.

+0

Correcto, pero eso solo me dará la información Total y no la otra, ¿correcto? – k00k

+0

No quiere conservar la otra información, quiere el total de toda la información, entonces no hay forma de combinar el resto de las filas. Si desea obtener la suma de cada fila, solo agregue la SUMA (fila) una y otra vez. Espera, ¿quieres una fila separada para el total? –

+0

Sí, quiero mantener la otra información en el resultado también. Me gustaría tener un campo separado/adicional para el total. – k00k

1
SELECT TB.campaign_id, TB.campaign_amount, TB.warning_trigger, TB.code_count, TB.days_remain, TB.row_total, SUM(TB.row_total) GlobalTotal FROM (SELECT c.id AS campaign_id, c.amount AS campaign_amount, c.warning_trigger, 
COUNT(cc.id) as code_count, DATEDIFF(c.end_date, CURDATE()) as days_remain, 
SUM(c.amount) as row_total 
FROM campaigns c 
JOIN campaign_codes cc 
LEFT JOIN partners p on p.id = 4 
WHERE c.partner_id = 4 AND cc.status = 0 AND c.id = cc.campaign_id 
GROUP BY c.id 
ORDER BY campaign_amount ASC) TB 
GROUP BY TB.campaign_id, TB.campaign_amount, TB.warning_trigger, TB.code_count, TB.days_remain, TB.row_total 
+0

@Tufo: esto solo me dará el total y no todos los resultados de mi ejemplo también (lo cual necesito). – k00k

+0

entendido, ¿vas a hacer algún porcentaje con ambos, hun? he editado el código, pruébelo ahora – Tufo

+0

que arroja un error de: La mezcla de columnas GROUP (MIN(), MAX(), COUNT(), ...) sin columnas GROUP es ilegal si hay sin cláusula GROUP BY – k00k

Cuestiones relacionadas