web-dev-qa-db-ja.com

DISTINCT行を合計するにはどうすればよいですか?

DISTINCT行を合計する必要があるクエリで苦労しています。これを行う方法が必要です...しかし、私は道に迷っています。

これが私が持っているものです:

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)

これにより、userid4に属する郡ごとに異なる人口番号を提供する34行が得られますが、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

もちろん、GroupByの最後にZipcodes.CountyIDを追加するとすぐに、34行に戻ります。

助けてくれてありがとう。

ラッセルシュッテ。 。 。 。 。

以下のヘルプ(特にRobbのヘルプ)を取得した後、私は本当に必要なものを取得することができました-1つのクエリで各UserIDの母集団の詳細の合計:

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

貢献してくれた皆さん、ありがとう!

ラッセルシュッテ

7
Russell Schutte

全体的な数値が必要な場合は、

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
8
Robb

[〜#〜] group [〜#〜] BYを 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

データベースサーバーによっては、これは副選択を行うよりも効率的です。

3
Byron Whitlock

簡単な答えは「groupby」を使用することです。 Group byは、distinctと同じフィールドで同じ効果がありますが、集計関数を使用できます。 group byの後に「Having」句を追加して、表示したいレコードをフィルタリングできます。

2
Zachary Scott