2012-09-06 70 views
0

我有一个简单的查询:摘要信息栏

SELECT sds.district_id,detail.year, detail.race, SUM(count) 
FROM school_data_race_ethnicity_raw as detail 
INNER JOIN school_data_schools as sds USING (school_id) 
GROUP BY district_id, year, race 

示例结果集:

| 68080104 | 2009 | Multiracial  |   0 | 
| 68080104 | 2009 | White   |  847 | 
| 68080104 | 2010 | American Indian |   1 | 
| 68080104 | 2010 | Asian   |   4 | 
| 68080104 | 2010 | Black   |   17 | 
| 68080104 | 2010 | Hispanic  |   4 | 
| 68080104 | 2010 | Multiracial  |   2 | 
| 68080104 | 2010 | White   |  823 | 
| 68080104 | 2011 | American Indian |   4 | 
| 68080104 | 2011 | Asian   |   4 | 
| 68080104 | 2011 | Black   |   9 | 
| 68080104 | 2011 | Hispanic  |   10 | 
| 68080104 | 2011 | Multiracial  |   24 | 
| 68080104 | 2011 | White   |  767 | 
+-------------+------+-----------------+------------+ 

我想添加一个名为总第5列,显示总人口的总和对于给定的年份和地区。例如,如果我2011年在68080104区,总数将是(4 + 4 + 9 + 10 + 24 + 767)。我需要这个作为这个查询中的另一列。它也需要快速。 (在10秒以内)。我正在努力如何做到这一点,而不是妥协的速度和数据。

+0

检查下面我的解决方案,你需要创建一个单独的查询来计数值,然后加入它与原来的一个 –

回答

2

使用您需要为创建一个单独的查询,并与原来的加入。试试这个,

SELECT a.*, b.totalCount 
FROM 
    (
     SELECT sds.district_id,detail.year, detail.race, SUM(count) 
     FROM school_data_race_ethnicity_raw as detail 
        INNER JOIN school_data_schools as sds 
         USING (school_id) 
     GROUP BY district_id, year, race 
    ) a INNER JOIN 
    (
     SELECT sds.district_id,detail.year, SUM(count) totalCount 
     FROM school_data_race_ethnicity_raw as detail 
        INNER JOIN school_data_schools as sds 
         USING (school_id) 
     GROUP BY district_id, year 
    ) b ON a.district_id = b.district_id AND 
      a.year = b.year 
1

WITH ROLLUP

SELECT sds.district_id,detail.year, detail.race, SUM(count) 
FROM school_data_race_ethnicity_raw as detail 
INNER JOIN school_data_schools as sds USING (school_id) 
GROUP BY district_id, year, race WITH ROLLUP 
+0

我不想有空值,有没有办法做到这一点,而不使用汇总? –

0

在MySQL中,得到在同一行,你几乎是数据已经做到这一点的加入:

select t.*, t2.cnt as TotalDistrictYear 
from (SELECT sds.district_id,detail.year, detail.race, SUM(count) as cnt 
     FROM school_data_race_ethnicity_raw as detail INNER JOIN 
      school_data_schools as sds USING (school_id) 
     GROUP BY district_id, year, race 
    ) t join 
    (SELECT sds.district_id,detail.year,SUM(count) as cnt 
     FROM school_data_race_ethnicity_raw as detail INNER JOIN 
      school_data_schools as sds USING (school_id) 
     GROUP BY district_id, year 
    ) t2 
    on t.district_id = t2.district_id and 
     t.year = t2.year