2010-11-19 15 views
5

Estoy desarrollando un pequeño procedimiento almacenado en SQL Server 2008. Tengo poco conocimiento sobre las consultas SQL, pero lo suficiente para lograr tareas simples. Sin embargo, surgió un problema que no puedo resolver por mi cuenta. Antes de comenzar a explicar mi problema, discúlpeme si deletreo incorrectamente una palabra de consulta SQL porque no soy un hablante nativo de inglés.¿Cómo se resume un campo dependiendo de otro valor de campo?

tengo 4 campos de representación (CSV):

ID, NAME, VALUES, ANSWER 
25, Tom , 2400 , 0     
25, Tom , 600 , 0     
25, Tom , 500 , 1     
25, Tom , 300 , 1     
27, Jerry, 100, 0     
27, Jerry, 20, 1     
27, Jerry, 60, 1     
27, Jerry, 2000, 0  

Lo que queremos hacer es agrupar por la selección por sus ID y NAME, resumir, de los valores en un campo denominado positive when ANSWER = 1 y negative when ANSWER = 0.

ID, NAME, SUM, NEGATIVE, POSITIVE 
25, Tom, 3000, 800     
27, Jerry, 2100, 80 

supongo que mi pregunta se ha hecho varias veces, pero no fue capaz de encontrar nada al respecto, probablemente porque yo estoy usando los términos equivocados. De todos modos, si alguien pudiera ayudar, eso me ahorraría mucho tiempo.

+0

http://stackoverflow.com/questions/30563/sql-returning-the-sum-of-items-depending-on-which-type-it-is – JNK

+0

+1, simplemente porque esto es en realidad bastante bien pregunta hecha. (También gracias al editor.) Tiene datos de entrada simples e ilustrativos y realmente muestra el conjunto de resultados deseado. – Matt

+0

Estoy de acuerdo con Matt, esta es una pregunta bien ilustrada y el objetivo es claro como el agua. Esto ayuda mucho a los hablantes de inglés no nativos. =) –

Respuesta

4

Lo harás con una declaración CASE.

+0

Creo que es necesario eliminar Valores de las cláusulas select y group by – houlgap

+0

@houlgap: Eso es lo que noté después de haber releído la pregunta por tercera vez para asegurarme de haber entendido la pregunta. Gracias por dejarme saber, eso es bueno! =) –

+0

@Ephismen: ¿Responde esto a su pregunta correctamente? ¿Entendí correctamente tu necesidad o sis extraño algo? –

2

reescribir su SQL con columnas como esta:

sum(case when answer=0 then values else 0 end) negative

1

Ephismen,

El ejemplo darle tiene un problema oculto en ella. ¿Siempre tendrás al menos un positivo y uno negativo? ¿Qué quieres que pase si solo tienes uno o el otro y no ambos? Unirse a la tabla en sí mismo no funcionará cuando tenga varias filas para cada identificación y nombre.

una unión de dos consultas separadas será capaz de responder a estas preguntas, pero no estoy seguro si es aplicable para el servidor SQL 2008.

Usted puede ser capaz de lograr esto mediante el uso de la cláusula GROUP BY para SQL de la siguiente :

select id 
    , name 
    , sum (neg_values) as negative 
    , sum (pos_values) as positive 
    from         -- temporary table 
    (select id 
      , name 
      , sum (values) as neg_values 
      , 0   as pos_values -- placeholder 
     from mytable 
     where answer = 0     -- negative 
     group by id 
       , name 
     union all 
     select id 
      , name 
      , 0   as neg_values -- placeholder 
      , sum (values) as pos_values 
     from mytable 
     where answer = 1     -- positive 
     group by id 
       , name 
    ) 
    group by id 
     , name 

La tabla temporal (interno de selección con la unión) devolverá filas similares a esta:

id name neg_value pos_value 
25 tom  3000   0 
25 tom   0  800 
27 jerry  2100   0 
27 jerry  0  80 

La final de selección volverá a su resu deseada lts (resumiéndolos juntos).

+0

En mi caso, siempre habrá ambas cosas, así que no tengo que preocuparme por eso, pero lo que usted indicó es cierto. Le salvaré la respuesta en caso de que enfrente este problema algún día, y lo haré +1, ya que esto podría ayudar a otros. – Aymeric

Cuestiones relacionadas