2015-09-24 2 views
0

Я играю с этим для того, что кажется часами, и я не могу получить результаты, которые я хочу. Вот запрос, с которым у меня возникают проблемы:Суммирование сумм MySQL по состоянию на год

SELECT year.year, dstate, 
    (SELECT sum(amount) FROM gift 
     WHERE year.year = gift.year 
     AND gift.donorno = donor.donorno) 
    FROM donor, gift, year 
     WHERE year.year = gift.year 
     AND gift.donorno = donor.donorno; 

Это кажется излишним. Во всяком случае, я пытаюсь показать общее количество пожертвований (gift.amount) для каждого штата по годам.

ex. 
1999 GA 500 (donorno 1 from GA donated 200 and donorno 2 from GA donated 300) 
1999 FL 400 
2000 GA 600 
2000 FL 500 
... 

Для уточнения доноров могут быть из того же состояния, но я пытаюсь составить дар сумму для этого государства в течение года он пожертвовал. Любые советы приветствуются. Я чувствую, что ответ прямо передо мной.

Вот картина таблиц для справки: table diagram

ответ

0

Это очень простое соединение & проблема агрегации.

SELECT y.year, d.state, SUM(g.amount) AS total 
FROM gift AS g 
INNER JOIN year AS y ON y.year=g.year 
INNER JOIN donor AS d ON d.donorno=g.donorno 
GROUP BY y.year, d.state 

Вам не нужен подзапрос в предложении SELECT, чтобы получить общую сумму. Вы можете суммировать его, группируя. (Я думаю, что предложение GROUP BY - это то, что вам не хватает. Я рекомендую прочитать его.) То, что вы сделали, называется коррелированным подзапросом, и оно будет очень медленным на больших наборах данных, поскольку оно должно быть вычисляется по строкам, а не как заданная операция.

Кроме того, пожалуйста, не используйте синтаксис старого стиля для запятой. Вместо этого используйте синтаксис явного соединения, как показано выше. Это намного яснее и поможет избежать случайных декартовых произведений.

+0

спасибо. Как вы, вероятно, можете сказать, что я новичок в SQL и в настоящее время беру вводный курс. Я не совсем уверен, что вы подразумеваете под «синтаксисом синтаксиса старого стиля». Мне также нужно будет прочитать, как использовать ключевое слово INNER JOIN. Некоторые из моих экспериментов заставили меня использовать GROUP BY, но я не знал, что вы можете использовать его с несколькими столбцами. Очевидно, это была моя проблема. Мне придется больше поработать над этим! – Colin93

+0

Объединения могут быть сделаны путем перечисления таблиц в предложении FROM и разделения их запятыми, а затем указания синтаксиса соединения в предложении WHERE. если вы забудете поставить условия соединения, вы получите декартово произведение (каждая строка каждой таблицы будет соединена с каждой строкой других таблиц, чтобы вы получили '(Таблица1 строк) * (Таблица 2 строки) * (Таблица 3 Строки) '), что, скорее всего, не то, что вы хотите. Используя явный синтаксис JOIN, гораздо легче увидеть, если вы забудете условия для соединения. Знать разницу между соединением INNER, LEFT, RIGHT и CROSS - важный навык. –

Смежные вопросы