2012-04-02 12 views
23

Mam tabeli, który wygląda mniej więcej tak:MySQL - jak wybierać na podstawie wartości innego 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 

Użytkownik może kwerendę opartą na szeregu lat i zwróci sumę wartości zgrupowane według nazwy, jako taki (zakładamy przeszukał roku to 2000 - 2001):

Name SUM(Value) 
A   8 
B   7 

teraz chciałem wstawić pole obliczeniowe, które wyprowadza stosunek sumy wartości każdej nazwy dla wszystkich lat do suma wszystkich wartości. Zasadniczo procent wszystkich wartości nadana A i B, odpowiednio, jak:

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

zauważyć, że chociaż użytkownik odpytywany tylko 2000-2001, chcę użyć obliczanie sumy we wszystkich latach. Od wielu godzin szukam i eksperymentuję i nie wiem, jak to zrobić. Wiem tylko, jak podsumować latami zapytania:

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

Proszę pomóc! Jestem nowicjuszem i nie rozumiem języka SQL w dużym stopniu, więc proszę wyjaśnij dowolny zaawansowany kod. Dziękuję za życzliwość.

Odpowiedz

42

można obliczyć sumę (i od tego pożądany odsetek) za pomocą podzapytania w klauzuli 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; 

Należy zauważyć, że podzapytanie nie zawiera klauzuli WHERE filtrującej lata.

+0

Najprościej zrozumieć i działać jak czar. Dziękuję bardzo! – John

3

Jeśli chcesz SELECT na podstawie wartości innego SELECT, to prawdopodobnie chcą "podselekcji":

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

na przykład (z linku powyżej):

  1. Chcesz pierwsze i ostatnie nazwiska z tabeli "student_details" ...

  2. Ale ty tylko chcesz tę informację dla tych uczniów w klasie „nauka”:

    SELECT id, first_name 
    FROM student_details 
    WHERE first_name IN (SELECT first_name 
    FROM student_details 
    WHERE subject= 'Science'); 
    

Szczerze mówiąc, nie jestem pewien, że to jest to, czego szukasz, czy nie ... ale mam nadzieję, to pomaga ... przynajmniej trochę ...

IMHO ...

+0

Próbka nie jest w ogóle użyteczna, o ile podzapytanie nie ma sensu. – zerkms

+0

Mam za dużo, ale nie mogę znaleźć składni. Próbuję dołączyć wartość z wewnętrznej tabeli, która opiera się na wartości z zewnętrznej tabeli. – John

+0

Rekomendacja książki: http://www.amazon.com/SQL-Queries-Mere-Mortals-Manipulation/dp/0321444434 Osobiście znalazłem to bardzo pomocne. Szczerze myślę, że ci się to spodoba. IMHO ... – paulsm4

2
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 
+0

Skąd się bierze x? – John

+0

@John: jest to tylko alias dla zapytania zagnieżdżonego – zerkms

Powiązane problemy