2010-12-16 13 views
7

Estoy luchando con una consulta donde necesito SUMAR Filas DISTINCT. Tiene que haber una forma de hacer esto ... pero estoy perdido.¿Cómo SUMO Filas DISTINCT?

Esto es lo que tengo:

SELECT DISTINCT Zipcodes.CountyID, 
us_co_est2005_allData.PopEstimate2005, 
us_co_est2005_allData.EstimatesBase2000, 
users_link_territory.userID 
FROM 
Zipcodes Inner Join Users_link_territory ON zipcodes.CountyID = 
Users_link_territory.CountyID Inner Join 
us_co_est2005_alldata ON zipcodes.FIPS = us_co_est2005_alldata.State AND zipcodes.code 
= us_co_est2005_alldata.County 
WHERE (users_link_territory.userid = 4) 

Esto me da las 34 filas que proporcionan las cifras de población distintos para cada condado perteneciente a userid4, pero ¿cómo puedo obtener la suma de PopEstimate2005 y EstimatesBase2000?

Algo así como (pero esto no es una consulta legal):

SELECT DISTINCT Zipcodes.CountyID, 
SUM(us_co_est2005_allData.PopEstimate2005) AS Population2005, 
SUM(us_co_est2005_allData.EstimatesBase2000) AS Population2000, 
users_link_territory.userID 
FROM 
Zipcodes Inner Join Users_link_territory ON zipcodes.CountyID = 
Users_link_territory.CountyID Inner Join 
us_co_est2005_alldata ON zipcodes.FIPS = us_co_est2005_alldata.State AND zipcodes.code 
= us_co_est2005_alldata.County 
WHERE (users_link_territory.userid = 4) 
GROUP BY users_link_territory.userid 

Por supuesto, tan pronto como se agrego Zipcodes.CountyID hasta el final de la GroupBy, estoy de vuelta con mis 34 filas de nuevo.

Muchas gracias por cualquier ayuda.

Russell Schutte . . . . .

Después de conseguir la ayuda de abajo - en particular de ayuda de Robb - yo era capaz de conseguir lo que realmente quería - un total de datos de población de cada UserID en una sola consulta:

SELECT  SUM(POPESTIMATE2005) AS Expr1, SUM(ESTIMATESBASE2000) AS Expr2, UserID 
FROM   (
    SELECT DISTINCT zipcodes.CountyID, us_co_est2005_alldata.POPESTIMATE2005, us_co_est2005_alldata.ESTIMATESBASE2000, users_link_territory.UserID 
    FROM   zipcodes INNER JOIN 
    users_link_territory ON zipcodes.CountyID = users_link_territory.CountyID INNER JOIN 
    us_co_est2005_alldata ON zipcodes.FIPS = us_co_est2005_alldata.STATE AND zipcodes.Code = us_co_est2005_alldata.COUNTY 
    ) As FOO 
GROUP BY UserID 

Gracias a todos los que contribuyeron!

Russell Schutte

+0

Formatee su SQL para que sea más fácil de leer, por favor. – Todd

+0

Acabo de descubrir cómo ... gracias Todd. –

Respuesta

8

Si lo que desea es una cifra global para que intente

select sum(PopEstimate2005), sum(EstimatesBase2000) 
from(
    SELECT Distinct 
     Zipcodes.CountyID, 
     us_co_est2005_allData.PopEstimate2005, 
     us_co_est2005_allData.EstimatesBase2000, 
     users_link_territory.userID 
    FROM 
     Zipcodes Inner Join 
     Users_link_territory ON zipcodes.CountyID = Users_link_territory.CountyID Inner Join 
     us_co_est2005_alldata ON zipcodes.FIPS = us_co_est2005_alldata.State AND zipcodes.code = us_co_est2005_alldata.County 
    WHERE 
     (users_link_territory.userid = 4) 
) as foo 
+2

Hola Robb: gracias por la respuesta rápida. Ya casi estás ... y lo descubrí por tu respuesta. Cualquiera que intente seguir esto o buscarlo más tarde: simplemente agregue la palabra clave DISTINCT de regreso al SELECT interno, antes de Zipcodes.CountyID. No sé si hay una manera de hacer que el GroupBy funcione, ¡pero esto es todo! Gracias Robb! –

+0

@ user541022 Me alegro de que funcionó para usted, supongo que debo haber destrozado el código ligeramente al formatearlo, editado para incluir la diferencia que falta! – Robb

+0

Gracias Robb ... Había intentado hacer una subselección así ... pero me equivocaron cuando recibí el mensaje "Sintaxis incorrecta" sobre el último paréntesis. Nunca supe agregar "como foo". Eso es genial. ¿Cuándo lo necesito? –

2

Una respuesta fácil es el uso "grupo por". Agrupar por tiene el mismo efecto con los mismos campos que los distintos, pero le permite usar funciones agregadas. Puede agregar una cláusula "Tener" después del grupo para filtrar los registros que le gustaría ver.

+0

No estoy seguro de dónde sugiere que vaya el "grupo por". –

2

Uso GROUP POR junto con los SUM() y COUNT() agregados.

SELECT count(*) as totalRows, Zipcodes.CountyID, 
    sum(us_co_est2005_allData.PopEstimate2005) as SumPopEstimate2005, 
    sum(us_co_est2005_allData.EstimatesBase2000) as SumEstimatesBase2000, 
    users_link_territory.userID 

FROM 
    Zipcodes Inner Join Users_link_territory ON zipcodes.CountyID = 
    Users_link_territory.CountyID Inner Join 
    us_co_est2005_alldata ON zipcodes.FIPS = us_co_est2005_alldata.State AND zipcodes.code = us_co_est2005_alldata.County 

WHERE (users_link_territory.userid = 4) 

GROUP BY Zipcodes.CountyID,users_link_territory.userID 

Dependiendo de su servidor de base de datos, esto será más eficiente que hacer una sub selección.

+0

Esto no da la suma final, me da las mismas 34 filas con las que comencé, las que necesito para SUM. :-) Gracias por ayudar a Byron. –

+0

En realidad, simplemente ponga esto en una selección interna, luego sume las columnas desde allí. –