2011-05-03 11 views
9

estoy golpeando mi cerebro contra ésteSQL Server Query LEFT JOIN, SUM y GROUP BY y estoy perplejo!

tengo Server 2005 tablas 3 SQL

userawards:

id, awardamount, userid, dateawarded, awardtypeid 

usuario:

id, firstname, lastname 

awardtypes:

id, title 

Así que si la mesa awards tenía las filas

1, 300.00, 3, 01-01-2011, 1 
2, 125.00, 3, 01-05-2011, 1 
3, 50.00, 2, 01-05-2011, 2 

filas de la tabla de usuario

1, john, smith 
2, mark, smith 
3, bob, smith 

tipos de premios

1, cash 
2, prize 

y quiero la salida a un aspecto similar a este

bob smith, 425.00, cash 
mark smith, 50, prize 

, etc, etc

Un usuario puede tener múltiples premios, los resultados deben mostrar de usuarios únicos, pero con no cantidad total de la adjudicación. Además, debe haber 2 combinaciones, una, para obtener el nombre/apellido del usuario que está en la tabla de usuario y el título del tipo de premio.

lo tanto, mi consulta es el aspecto de este (ya sé que no funciona)

SELECT id, userid, awardtypeid, SUM(awardamount) 
FROM awards a 
LEFT JOIN userinfo ui ON ui.userid = a,userid 
LEFT JOIN awardtypes ON awardtypesid = a.awardtypeid 
GROUP BY userid 

Es esto posible?

+1

Si un usuario tiene múltiples premios de diferentes tipos, lo que debe ser el resultado esperado? – Thomas

+0

Ayudaría mostrarnos algunas entradas de muestra y resultados esperados. Además, ¿qué versión de SQL Server? – Thomas

+0

Tienes un, en lugar de. En a, userid – extraneon

Respuesta

16

Es posible que desee

SELECT userid, 
     awardtypeid, 
     SUM(awardamount) 
FROM awards a 
     LEFT JOIN userinfo ui 
     ON ui.userid = a.userid 
     LEFT JOIN awardtypes 
     ON awardtypesid = a.awardtypeid 
GROUP BY userid, 
      awardtypeid 

o

SELECT userid, 
     SUM(awardamount) 
FROM awards a 
     LEFT JOIN userinfo ui 
     ON ui.userid = a.userid 
     LEFT JOIN awardtypes 
     ON awardtypesid = a.awardtypeid 
GROUP BY userid 

Esto deja caer la columna id (probablemente no es lo que desea agrupar en)

En el primer caso incluí la awardtypeid en el seleccionado pero esto significa que también debe agregar eso al grupo por.

+0

Yo votaría pero aún no tengo el representante ... pero sí, esto resuelve mi problema. ¡Gracias! – Sherdog

+0

+1 para la capacidad de recoger lo que se desea de lo que se dio (y de la respuesta). – Thomas

+0

Gracias, Conrad, acepté tu respuesta :) gracias por la información al respecto. Miré justo después de la marca de verificación. Y sí, gracias por dar la respuesta con mi mal intento de explicar la situación: D – Sherdog

0

Puede hacerlo, pero la forma en que lo hace ahora es que mostrará el número de awardamount, o en realidad, la suma de la suma awarda, pero por identificación, usuario, combinación de premio. Es necesario para agarrar el usuario y la suma de premios por sí mismo, y luego unirse con awardtype id - acaba de ser conscientes de que la suma de las indemnizaciones correspondientes se repite para cada awardtypeid

SELECT 
    ??.id , 
    a.userid , 
    a.awardtypeid , 
    ab.awardamount , 
    <whateverelse> 
FROM 
    (select userid, SUM(awardamount) as awardamount FROM awards GROUP BY userid) AS ab 
INNER JOIN awards AS a on ab.userid = a.userid 
LEFT JOIN userinfo AS ui 
    ON ui.userid = a.userid 
LEFT JOIN awardtypes AS at 
    ON awardtypesid = a.awardtypeid 

Sumando la suma de awardamount por usuario Antes de unirte, deberías poder obtener lo que deseas, sin ningún tipo de agrupación.

0
SELECT 
    ui.FirstName 
,ui.LastName 
,at.Title AS Award 
,SUM(a.AwardAmount) AS AwardAmount 
FROM Awards a 
    INNER JOIN UserInfo ui ON ui.UserId = a.UserId 
    INNER JOIN AwardTypes at ON at.AwardTypeId = a.AwardTypeId 
GROUP BY ui.FirstName, ui.LastName, at.Title 
ORDER BY ui.LastName, ui.FirstName 
0

Si entiendo esto correctamente, no debe haber más de una fila por usuario y necesita un monto total de adjudicación por usuario. Por otro lado, desea saber qué tipo de premios tenía cada usuario. Puede mostrar lista delimitada por comas de premios para cada usuario:

select 
    usr.FirstName, 
    usr.LastName, 
    awd.AwardAmount, 
    AwardTypes = ( 
     select Title + ',' 
     from UserAwards uaw 
      join AwardTypes awt on 
       uaw.AwardTypeId = awt.Id 
     where uaw.UserId = usr.id 
     for xml path('')) 
from [User] usr 
    join (
     select UserId, sum(AwardAmount) AwardAmount 
     from UserAwards uaw 
     group by UserId 
    ) awd on 
     awd.UserId = usr.Id