2011-05-11 24 views
7

Suponga que tiene conjunto de resultados tales como:SQL ¿Cómo hacer una suma condicional mediante una identificación distinta?

DATE   ID cost  
--------------------------------------- 
01/01/2011 1  10  
01/01/2011 1  10  
01/01/2011 2  10  
01/01/2011 2  10  

quiero una manera de resumir los valores de costo, pero sólo una vez por cada ID distinta para que cuando el grupo por fecha obtengo un resultado como

DATE   cost 

01/01/2011   20 

intentó por primera vez algo así como

sum(distinct cost) 

pero eso de la maldición sólo se devuelve el 10 También probé:

sum(case when distinct id then cost else 0 end) 

pero eso no es una consulta funcional.

+2

¿Qué sabor de SQL estás usando? –

+0

¿Los valores de costo siempre son los mismos para una identificación dada? –

+0

Esto es Oracle, no puedo agrupar por fecha y Id, ya que necesito 1 fila por fecha. –

Respuesta

17

Supongo que la misma ID siempre tendrá el mismo costo en el mismo día. También asumiré que su RDBMS admite tablas derivadas. En ese caso, esto es lo que quiere:

select date, sum(cost) 
from 
    (select distinct date, id, cost from YourTable) 
group by date 

Actualizado

Oracle deriva tablas no requieren alias.

+0

Gracias, esto funciona –

0

Sin conocer el/motor de base de datos SQL:

seleccionar la fecha, Sum (Coste) DE GRUPO YourTable por fecha, ID;

SELECT Date, First(TCost) 
FROM 
(SELECT Date, Sum(Cost) as TCost FROM YourTable GROUP BY Date, ID) 
GROUP BY Date 
+0

A menos, por supuesto, hay algo que no estoy entendiendo desde la pregunta. – MPelletier

+0

con este enfoque tendrías dos registros para cada fecha. –

+0

@WillA Tengo problemas con la redacción de la pregunta, al parecer. De todas formas, creo que Adrian lo tiene. – MPelletier

1

Creo que todo lo que quiere hacer aquí es el grupo tanto por la fecha y la identificación, como escribió MPelletier.

Fwiw - usted puede hacer una diferencia dentro de un agregado en algunos DBS: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum

Y aún mejor, un grupo del uso por con paquete de continuación para obtener los totales junto con la agrupación: http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

SELECT DATE, ID, SUM(cost) 
FROM table_name 
GROUP BY DATE, ID WITH ROLLUP; 
1

Creo que hay algún error con la lógica de la pregunta publicada.

Suponga que tiene este conjunto de resultados:

DATE   ID cost  
--------------------------------------- 
01/01/2011 1  10  
01/01/2011 1  15  
01/01/2011 2  10  
01/01/2011 2  10  

¿Qué debe el retorno consulta?

DATE   cost  
--------------------------------------- 
01/01/2011 20  

o

DATE   cost  
--------------------------------------- 
01/01/2011 25 

La respuesta aceptada volverá 35.

¿O es imposible tenerlo?

-2

probar este

SELECT SUM(cost) AS Expr1 
    , ID 
    , date 
FROM (SELECT DISTINCT date 
      , ID 
      , cost 
     FROM table_name AS table_name_1 
     GROUP BY date, ID, cost) AS derivedtbl_1 
GROUP BY ID, date 

o ESTA

SELECT  SUM(cost) AS Expr1, date 
    FROM (SELECT DISTINCT date, ID, cost 
      FROM table_name AS table_name_1 
      GROUP BY date, ID, cost) AS derivedtbl_1 
GROUP BY date 
+0

Deseo que las personas comenten qué sucede cuando votan negativamente. – matiit

-2

Trate Esta
estoy usando MySQL para esto. DEMO TABLA (nombre de tabla es 'tablename'. Identificación y el costo es un tipo de 'int')

id | cost 
1 | 15 
1 | 25 
1 | 10 
2 | 25 
2 | 5 
2 | 10 
3 | 20  
3 | 15  
3 | 10  
4 | 20  
4 | 20 


de consulta utilizar

select id 
    , SUM(cost) as 'Total Cost' 
    from sumchk 
group by id 

OR (uso por debajo de uno)

select id, sum(cost) as 'Total Cost' 
    from (select * 
      from tablename 
) a 
group by id; 

Resultado:

id | Total Cost 
    1 | 50 
    2 | 40 
    3 | 45 
    4 | 40 
0

Puede usar esta consulta.

SELECT dates, Sum(cost) as TCost FROM TABLE_NAME GROUP BY ID 
Cuestiones relacionadas