在Select语句中使用子查询

时间:2010-01-21 06:16:22

标签: php sql mysql subquery

我有一个输出下表的查询:

(0) Age <= 19----------76-------0.12 

(1) Age 20 – 24--------661------1.06 

(2) Age 25 – 29-------4060------6.53 

(3) Age 30 – 34-------7231------11.64 

(4) Age 35 – 39-------9281------14.94 

(5) Age 40 – 44-------9539------15.35 

Total ----------------30848 -----49.65

第一列是特定细分的名称。第二列是该细分中的人数。

第三列是该段中人数占整个表的百分比。请注意,总数仅为整个基数的50%左右。

我需要的是另一列,即该段中人员的百分比,仅为此基数的百分比。所以第一行的公式是(76/30848)* 100,这将给出76作为30848的百分比。问题是在使用ROLLUP查询结束之前,数字30848是未知的。我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

我更喜欢第一个查询,但您的数据库可能不支持它。

SELECT
  segment,
  COUNT(*) AS people,
  100 * people / SUM(people) OVER () AS percentage
FROM table1
GROUP BY
  segment;

SELECT
  t1.segment,
  COUNT(*) AS people,
  100 * t1.people / t2.total_people AS percentage
FROM table1 t1
CROSS JOIN (
    SELECT
      COUNT(*) AS total_people
    FROM table1) t2
GROUP BY
  segment;

答案 1 :(得分:0)

我对你的回答有点困惑。也许我需要更好地解释布局。

这是一个查询,可以为20-24岁和30-34岁的两组人员提供结果。

SELECT CONCAT('(',s.code,') ',s.description) as `Segment`, count(`Age`) AS `Records Selected`, 
ROUND((count(`Age`)/(SELECT count(*) FROM mainTable))*100, 2) 
AS `Percentage of Total`
FROM segment_fields s, mainTable c 
WHERE `segment` = 'Age' AND `code` = `Age` AND `c`.`Age` IN ('1', '3') 
GROUP BY `Age` WITH ROLLUP

很抱歉它看起来很乱。基本上我需要在“总数百分比”之后的新专栏与“总分百分比”相同。但是,除了划分整个基数之外,它只会除以查询ROLLUP的结果记录数。