2010-12-16 830 views
7

Tôi đang gặp khó khăn với truy vấn mà tôi cần đến SUM DISTINCT hàng. Phải có cách để làm điều này ... nhưng tôi đã thua.Làm cách nào để TÙY CHỌN TÓM TẮT?

Đây là những gì tôi đã có:

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) 

này mang lại cho tôi 34 hàng mà cung cấp số dân riêng biệt cho từng quận thuộc userid4, nhưng làm thế nào tôi sẽ nhận được SUM của PopEstimate2005 và EstimatesBase2000?

Giống như (nhưng đây không phải là một truy vấn pháp lý):

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 

Tất nhiên, ngay sau khi tôi thêm Zipcodes.CountyID đến cuối của groupby, tôi trở lại với 34 hàng của tôi lần nữa.

Cảm ơn bạn rất nhiều vì đã giúp đỡ.

Russell Schutte . . . . .

Sau khi nhận được sự giúp đỡ bên dưới - để giúp đặc biệt Robb của - tôi đã có thể có được những gì tôi thực sự muốn - tổng cộng chi tiết dân số của mỗi UserID trong một truy vấn duy nhất:

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 

Cảm ơn tất cả mọi người đã đóng góp!

Russell Schutte

+0

Định dạng SQL của bạn để dễ đọc hơn. – Todd

+0

Chỉ cần tìm ra cách ... cảm ơn Todd. –

Trả lời

8

Nếu bạn chỉ muốn một con số tổng thể cho nó thử

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

Xin chào Robb - Cảm ơn bạn đã trả lời nhanh. Bạn gần như ở đó ... và tôi đã tìm ra từ câu trả lời của bạn. Bất cứ ai cố gắng làm theo hoặc tra cứu nó sau này - Chỉ cần thêm từ khóa DISTINCT trở lại vào SELECT bên trong, trước mã Zipcodes.CountyID. Tôi không biết nếu có một cách để làm cho GroupBy làm việc, nhưng điều này là nó! Cảm ơn Robb! –

+0

@ user541022 Vui vì nó đã làm việc cho bạn, tôi đoán tôi phải có xé nhỏ mã trong khi định dạng lại nó, chỉnh sửa để bao gồm sự khác biệt còn thiếu! – Robb

+0

Cảm ơn Robb ... Tôi đã cố gắng thực hiện một subselect như thế ... nhưng đã bị phạm lỗi khi tôi nhận được thông báo "Cú pháp sai" về dấu ngoặc đơn cuối cùng. Tôi không bao giờ biết thêm "như foo". Thật tuyệt vời. Khi nào tôi cần nó? –

2

Câu trả lời dễ dàng được sử dụng "nhóm theo". Nhóm theo cùng tác dụng với các trường giống nhau, nhưng cho phép bạn sử dụng các hàm tổng hợp. Bạn có thể thêm mệnh đề "Có" sau nhóm để lọc những bản ghi nào bạn muốn xem.

+0

Không chắc chắn nơi bạn đề xuất "nhóm theo" để đi. –

2

Sử dụng GROUP THEO cùng với SUM()COUNT() uẩn.

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 

Tùy thuộc vào máy chủ db của bạn, điều này sẽ hiệu quả hơn so với thực hiện lựa chọn phụ.

+0

Điều này không đưa ra tổng số cuối cùng - nó mang lại cho tôi 34 hàng tương tự mà tôi đã bắt đầu - những thứ tôi cần để SUM. :-) Cảm ơn bạn đã giúp Byron. –

+0

Trên thực tế, chỉ cần đặt điều này trong một lựa chọn bên trong, sau đó tổng hợp các cột từ đó. –