Как СУММУЛИРОВАТЬ РАЗЛИЧНЫЕ РЯДЫ?

Я борюсь с запросом, где мне нужно SUM DISTINCT Rows. Должен быть способ сделать это... но я заблудился.

Вот что у меня есть:

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)

Это дает мне 34 строки, в которых указаны отдельные номера населения для каждого округа, принадлежащего userid4, но как мне получить СУММУ PopEstimate2005 и EstimatesBase2000?

Что-то вроде (но это не юридический запрос):

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

Конечно, как только я добавлю Zipcodes.CountyID в конец GroupBy, я снова вернусь к своим 34 строкам.

Большое спасибо за любую помощь.

Рассел Шутте. . . . .

Получив приведенную ниже помощь, в частности помощь Робба, я смог получить то, что действительно хотел, - общую информацию о каждом идентификаторе пользователя в одном запросе:

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

Спасибо всем, кто внес свой вклад!

Рассел Шутте


person Russell Schutte    schedule 16.12.2010    source источник
comment
Пожалуйста, отформатируйте свой SQL, чтобы его было легче читать.   -  person Todd    schedule 16.12.2010
comment
Только что понял, как... спасибо, Тодд.   -  person Russell Schutte    schedule 17.12.2010


Ответы (3)


Если вам просто нужна общая цифра, попробуйте

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
person Robb    schedule 16.12.2010
comment
Привет, Робб. Спасибо за быстрый ответ. Ты почти у цели... и я понял это из твоего ответа. Любой, кто пытается следовать этому или найти его позже - просто добавьте ключевое слово DISTINCT обратно во внутренний SELECT перед Zipcodes.CountyID. Я не знаю, есть ли способ заставить работать GroupBy, но это он! Спасибо, Робб! - person Russell Schutte; 16.12.2010
comment
@user541022 user541022 Рад, что это сработало для вас, я думаю, я, должно быть, немного исказил код, переформатируя его, отредактировав, чтобы включить недостающее отличие! - person Robb; 16.12.2010
comment
Спасибо, Робб... Я пытался сделать такой подвыбор... но ошибся, когда получил сообщение "Неправильный синтаксис" о последней скобке. Я никогда не знал, как добавить as foo. Это потрясающе. Когда мне это нужно? - person Russell Schutte; 16.12.2010
comment
@user541022 user541022 as foo дает таблице псевдоним, sqlserver вызывает шаткость, когда вы не называете свои подзапросы. Подсказка, которую вы можете найти, держит rsi в страхе, заключается в том, что вы можете использовать псевдоним для любой таблицы в вашем предложении from с более коротким именем, например us_co_est2005_alldata as dta, а затем ссылаться на него в своем предложении select как dta.popestimate2005 - person Robb; 16.12.2010

Используйте GROUP вместе с SUM() и COUNT () агрегаты.

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

В зависимости от вашего сервера БД это будет более эффективно, чем выполнение подвыборки.

person Byron Whitlock    schedule 16.12.2010
comment
Это не дает окончательную сумму - это дает мне те же 34 строки, с которых я начал, - те, которые мне нужно СУММИТЬ. :-) Спасибо за помощь Байрону. - person Russell Schutte; 16.12.2010
comment
На самом деле, просто поместите это во внутренний выбор, а затем просуммируйте оттуда столбцы. - person Zachary Scott; 17.12.2010

Простой ответ — использовать «группировать по». Группировать по имеет тот же эффект с теми же полями, что и отдельные, но позволяет использовать агрегатные функции. Вы можете добавить предложение «Наличие» после группы, чтобы отфильтровать записи, которые вы хотели бы видеть.

person Zachary Scott    schedule 16.12.2010
comment
Не уверен, куда вы предлагаете группе пойти. - person Russell Schutte; 16.12.2010