Подтвердить что ты не робот

MySQL - как SELECT на основе значения другого SELECT

У меня есть таблица, которая выглядит примерно так:

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 на глубине, поэтому, пожалуйста, проясните любой расширенный код. Спасибо за вашу доброту.

4b9b3361

Ответ 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

Например, (по ссылке выше):

  • Вы хотите, чтобы имя и фамилия из таблицы "student_details"...

  • Но вы хотите получить эту информацию только для учащихся в классе "science":

    SELECT id, first_name
    FROM student_details
    WHERE first_name IN (SELECT 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