我有一张看起来像这样的表:
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,所以请澄清任何高级代码。谢谢你的好意。
答案 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
例如,(来自上面的链接):
您想要“student_details”表中的名字和姓氏......
但您只想为“科学”课程中的学生提供此信息:
SELECT id, first_name
FROM student_details
WHERE first_name IN (SELECT first_name
FROM student_details
WHERE subject= 'Science');
... 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