【问题标题】:How to SELECT based on value of another SELECT如何根据另一个 SELECT 的值进行 SELECT
【发布时间】:2021-02-01 01:38:32
【问题描述】:

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

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

用户可以根据年份范围进行查询,会返回按Name分组的Value之和,如上(假设查询年份为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`;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以通过在 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 子句。

    【讨论】:

    • 最容易理解和工作就像一个魅力。非常感谢!
    【解决方案2】:

    如果你想SELECT基于另一个SELECT的值,那么你可能想要一个“子选择”:

    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'); 
      

    坦率地说,我不确定这是否是您正在寻找的东西......但我希望它会有所帮助......至少有点......

    恕我直言...

    【讨论】:

    • 该示例根本没有帮助,只要子查询在那里没有意义
    • 我记下了这么多,但我无法弄清楚语法。我正在尝试包含一个内部表中的值,该值依赖于外部表中的值。
    • 图书推荐:amazon.com/SQL-Queries-Mere-Mortals-Manipulation/dp/0321444434 就我个人而言,我觉得它很有帮助。老实说,我认为你可能也会喜欢它。恕我直言...
    • SELECT id, first_name FROM student_details WHERE subject = 'Science' 不完全一样吗?
    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多