为什么百分比在SQLite3中无法正常工作?

时间:2014-10-15 02:19:52

标签: sql database postgresql sqlite

我对以下问题有以下代码,但百分比发生在零:

SELECT p.state, (p.popestimate2011/sum(p.popestimate2011)) * 100
FROM pop_estimate_state_age_sex_race_origin p
WHERE p.age >= 21
GROUP BY p.state;

enter image description here

此处还有表格架构:

sqlite> .schema pop_estimate_state_age_sex_race_origin
CREATE TABLE pop_estimate_state_age_sex_race_origin (
   sumlev NUMBER, 
   region NUMBER, 
   division NUMBER, 
   state NUMBER, 
   sex NUMBER, 
   origin NUMBER, 
   race NUMBER, 
   age NUMBER, 
   census2010pop NUMBER, 
   estimatesbase2010 NUMBER, 
   popestimate2010 NUMBER, 
   popestimate2011 NUMBER, 
   PRIMARY KEY(state, age, sex, race, origin), 
   FOREIGN KEY(sumlev) REFERENCES SUMLEV(sumlev_cd), 
   FOREIGN KEY(region) REFERENCES REGION(region_cd), 
   FOREIGN KEY(division) REFERENCES DIVISION(division_cd), 
   FOREIGN KEY(sex) REFERENCES SEX(sex_cd), 
   FOREIGN KEY(race) REFERENCES RACE(race_cd), 
   FOREIGN KEY(origin) REFERENCES ORIGIN(origin_cd));

因此,当我运行查询时,它只显示百分比为0:

stat  p.popestimate
----  -------------
1     0            
2     0            
4     0            
5     0            
6     0            
8     0            
9     0            
10    0            
11    0            
12    0            
13    0            
15    0            
16    0            
17    0            
18    0            
19    0            
20    0            
21    0            
22    0            
23    0    

我试图使用嵌套查询来编写它并没有得到任何地方:

    SELECT p.state, 100.0 * sum(p.popestimate2011) / total_pop AS percentage
FROM pop_estimate_state_age_sex_race_origin p
JOIN (SELECT state, sum(p2.popestimate2011) AS total_pop
      FROM pop_estimate_state_age_sex_race_origin p2) s ON (s.state = p.state)
WHERE age >= 21
GROUP BY p.state, total_pop
ORDER BY p.state;

我遇到的当前问题是它只显示一行作为结果,只显示最后一个状态编号的结果(状态ID = 56):

56    0.131294163192301

4 个答案:

答案 0 :(得分:3)

这是一种不需要内部查询的方法(未经测试)。它通过表格进行单次传递,按州聚合,并使用CASE计算年龄超过20岁的人口的分子和州总人口的分母。

 SELECT 
    state,
    (SUM(CASE WHEN age >= 21 THEN popestimate2011 ELSE 0) / SUM(popestimate2011)) * 100
 FROM pop_estimate_state_age_sex_race_origin 
 GROUP BY state

答案 1 :(得分:1)

我不确定为什么你的SQL语句正在执行。您在GROUP BY选择中包含非聚合列值popestimate2011,这应该会生成错误。

仔细阅读SQLite文档表明 实际上支持结果表达式列表中非聚合列的随机值选择(MySQL提供的功能)。这解释了:

  1. 为什么您的SELECT语句能够执行(为非聚合popestimate2011引用选择随机值)。
  2. 为什么你看到0的结果:选择的随机值可能是第一个出现的行,如果行被添加到数据库中,以便该行可能具有年龄值0。因为你的分区中的分子会然后是0,结果也是0。
  3. 至于您的计算结果,从您的表定义中不清楚您的基表中的数据是否已经已经聚合,如果是,那么{{1列表示(平均值?该行的分组因子?)

    最后,SQLite没有age数据类型。这些列将获得NUMBER的默认关联,这可能是您想要的,但可能不是。

答案 2 :(得分:0)

你需要这些内容(未经测试):

SELECT state,  SUM(popestimate2011) / 
               (SELECT SUM(popestimate2011) 
                FROM pop_estimate_state_age_sex_race_origin 
                WHERE age > 21)))      
               * 100 as percentage
FROM pop_estimate_state_age_sex_race_origi
WHERE age >= 21
GROUP by state      
;

答案 3 :(得分:0)

SQLite中不存在NUMBER类型。 SQLite解释为INTEGER和 小数在整数除法中丢失

(p.popestimate2011 / sum (p.popestimate2011))

始终为0.

更改列popestimate2011 REAL的类型 或使用CAST(...)

(CAST (p.popestimate2011 AS REAL) / SUM (p.popestimate2011))