mysql查询中的摘要信息列

时间:2012-09-06 15:04:41

标签: mysql sql

我有一个简单的查询:

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 |
+-------------+------+-----------------+------------+

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

3 个答案:

答案 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 :(得分: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

答案 2 :(得分: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