MySQL - 如何基于另一个SELECT的值进行SELECT

时间:2012-04-02 03:16:34

标签: mysql

我有一张看起来像这样的表:

Name    Year   Value
 A      2000     5
 A      2001     3
 A      2002     7
 A      2003     1
 B      2000     6
 B      2001     1
 B      2002     8
 B      2003     2

用户可以根据年份进行查询,并返回按名称分组的值之和(假设查询年份为2000年至2001年):

Name   SUM(Value)
 A         8
 B         7

现在,我想插入一个计算字段,该字段输出所有年份的每个名称的值之和与所有值之和的比率。基本上分别归因于A和B的所有值的百分比,如:

Name   SUM(Value)   % Of Total
 A         8            0.484      (16 / 33)
 B         7            0.516      (17 / 33)

请注意,即使用户仅查询2000-2001,我希望计算使用所有年份的总和。我一直在寻找和试验几个小时,我无法弄清楚如何。我只知道如何总结所查询的年份:

SELECT `Name`, SUM(`Value`)/(SELECT SUM(`Value`) FROM `table1`) AS "% of Total"
FROM `table1`
WHERE `Year` BETWEEN 2000 AND 2001
GROUP BY `Name`;

请帮忙!我是一个非常新手,并且不太了解SQL,所以请澄清任何高级代码。谢谢你的好意。

3 个答案:

答案 0 :(得分:62)

您可以使用FROM子句中的子查询来计算总数(以及所需的百分比):

SELECT Name,
       SUM(Value) AS "SUM(VALUE)",
       SUM(Value) / totals.total AS "% of Total"
FROM   table1,
       (
           SELECT Name,
                  SUM(Value) AS total
           FROM   table1
           GROUP BY Name
       ) AS totals
WHERE  table1.Name = totals.Name
AND    Year BETWEEN 2000 AND 2001
GROUP BY Name;

请注意,子查询没有过滤年份的WHERE子句。

答案 1 :(得分:7)

如果你想根据另一个SELECT 的值 SELECT,那么你可能想要一个“subselect”:

http://beginner-sql-tutorial.com/sql-subquery.htm

例如,(来自上面的链接):

  1. 您想要“student_details”表中的名字和姓氏......

  2. 但您只想为“科学”课程中的学生提供此信息:

    SELECT id, first_name
    FROM student_details
    WHERE first_name IN (SELECT first_name
    FROM student_details
    WHERE subject= 'Science'); 
    
  3. 坦率地说,我不确定这是你在寻找与否......但我希望它有所帮助......至少有一点......

    ... IMHO

答案 2 :(得分:4)

SELECT x.name, x.summary, (x.summary / COUNT(*)) as percents_of_total
FROM tbl t
INNER JOIN 
(SELECT name, SUM(value) as summary
FROM tbl
WHERE year BETWEEN 2000 AND 2001
GROUP BY name) x ON x.name = t.name
GROUP BY x.name, x.summary