2013-08-05 6 views
0

У меня есть большой DDBB MySQL, и некоторые вычисления и агрегации должны быть выполнены. Одна из таблиц, скажем, называемая «thebigtable», получила различную информацию, а некоторые из вычислений извлекают различную информацию.Присоединение к нескольким запросам

Давайте использовать пример для "thebigtable":

+-----+-----------+------------+---------+ 
| id | secondid | date  | value | 
+-----+-----------+------------+---------+ 
| 001 | AAA1  | 2010-01-01 | 1000.00 | 
| 001 | AAA1  | 2010-02-01 | 1000.00 | 
| 001 | AAA1  | 2010-03-01 | 1000.00 | 
| 001 | AAA1  | 2010-04-01 | 1000.00 | 
| 001 | AAA1  | 2010-05-01 | 1000.00 | 
| 001 | AAA1  | 2010-06-01 | 1000.00 | 
| 001 | AAA1  | 2010-07-01 | 1000.00 | 
| 001 | AAA1  | 2010-08-01 | 1000.00 | 
| 001 | AAA1  | 2010-09-01 | 1000.00 | 
| 001 | AAA1  | 2010-10-01 | 1000.00 | 
| 001 | AAA1  | 2010-11-01 | 1000.00 | 
| 001 | AAA1  | 2010-12-01 | 1000.00 | 
+-----+-----------+------------+---------+ 
| 001 | AAA2  | 2010-01-01 | 1000.00 | 
| 001 | AAA2  | 2010-02-01 | 1000.00 | 
| 001 | AAA2  | 2010-03-01 | 1000.00 | 
| 001 | AAA2  | 2010-04-01 | 1000.00 | 
| 001 | AAA2  | 2010-05-01 | 1000.00 | 
| 001 | AAA2  | 2010-06-01 | 1000.00 | 
| 001 | AAA2  | 2010-07-01 | 1000.00 | 
| 001 | AAA2  | 2010-08-01 | 1000.00 | 
| 001 | AAA2  | 2010-09-01 | 1000.00 | 
| 001 | AAA2  | 2010-10-01 | 1000.00 | 
| 001 | AAA2  | 2010-11-01 | 1000.00 | 
| 001 | AAA2  | 2010-12-01 | 1000.00 | 
+-----+-----------+------------+---------+ 
| 002 | AAA1  | 2010-01-01 | 1000.00 | 
| 002 | AAA1  | 2010-02-01 | 1000.00 | 
| 002 | AAA1  | 2010-03-01 | 1000.00 | 
| 002 | AAA1  | 2010-04-01 | 1000.00 | 
| 002 | AAA1  | 2010-05-01 | 1000.00 | 
| 002 | AAA1  | 2010-06-01 | 1000.00 | 
| 002 | AAA1  | 2010-07-01 | 1000.00 | 
| 002 | AAA1  | 2010-08-01 | 1000.00 | 
| 002 | AAA1  | 2010-09-01 | 1000.00 | 
| 002 | AAA1  | 2010-10-01 | 1000.00 | 
| 002 | AAA1  | 2010-11-01 | 1000.00 | 
| 002 | AAA1  | 2010-12-01 | 1000.00 | 
+-----+-----------+------------+---------+ 
| 002 | AAA2  | 2010-01-01 | 1000.00 | 
| 002 | AAA2  | 2010-02-01 | 1000.00 | 
| 002 | AAA2  | 2010-03-01 | 1000.00 | 
| 002 | AAA2  | 2010-04-01 | 1000.00 | 
| 002 | AAA2  | 2010-05-01 | 1000.00 | 
| 002 | AAA2  | 2010-06-01 | 1000.00 | 
| 002 | AAA2  | 2010-07-01 | 1000.00 | 
| 002 | AAA2  | 2010-08-01 | 1000.00 | 
| 002 | AAA2  | 2010-09-01 | 1000.00 | 
| 002 | AAA2  | 2010-10-01 | 1000.00 | 
| 002 | AAA2  | 2010-11-01 | 1000.00 | 
| 002 | AAA2  | 2010-12-01 | 1000.00 | 
+-----+-----------+------------+---------+ 

Ok. Давайте теперь зададим QUERIES, которые я должен выполнить. Первый, вычисляет количество различных «secondid» для каждого «ид» с условием, что дата от месяца 08 до 10:

> SELECT id, COUNT(secondid) FROM thebigtable WHERE (date >= '2010-08-01') and (date <= '2010-10-01') GROUP BY id; 

Результат должен быть:

+-----+-----------------+ 
| id | count(secondid) | 
+-----+-----------------+ 
| 001 | 2    | 
| 002 | 2    | 
+-----+-----------------+ 

Второй QUERY, следует вычислить сумму значений для каждого идентификатора с условием, что дата является только месяц 08:

> SELECT id, SUM(value) FROM thebigtable WHERE (date LIKE '2010-08-01') GROUP BY secondid; 

Результат должен быть:

+-----+-------------+ 
| id | sum(values) | 
+-----+-------------+ 
| 001 | 2000.00  | 
| 002 | 2000.00  | 
+-----+-------------+ 

Я хочу, чтобы показать оба ВЫБРАТЬ под только один результат, а именно:

+-----+-----------------+-------------+ 
| id | count(secondid) | sum(values) | 
+-----+-----------------+-------------+ 
| 001 | 2    | 2000.00  | 
| 002 | 2    | 2000.00  | 
+-----+-----------------+-------------+ 

Я судимое создать представления и присоединиться затем после, или создать союз как SELECT, но ни один из они работают.

Любая помощь?

+0

Какие ошибки вы получаете? – Mihai

+0

Если ваш второй запрос не является 'SELECT id, SUM (значение) FROM thebigtable WHERE (date LIKE '2010-08-01') GROUP BY id' i.e. * не * сгруппировано по' secondid'? – cars10m

ответ

0

Я надеюсь, что это поможет вам:

SELECT id, SUM(cnt) cnt, SUM(IF(yemo='1008',val,0)) val FROM (
SELECT id, 
     date_format(`date`,'%y%m') yemo, 
     COUNT(secondid)    cnt, 
     SUM(`value`)    val 
FROM bigtable GROUP BY id,date_format(`date`,'%y%m') 
) t WHERE yemo between '1008' AND '1009' GROUP BY id 

Хотя, по моему SQLfiddle получившемуся числу для столбца count(secondid) в вашем первом запросе должен быть 4, а не 2 для двух идентификаторов в вопросе. Или я пропустил точку?!?

1

Попробуйте использовать подзапросы, как

SELECT a.id, b.secondid, c.value_sum 
FROM 
    thebigtable a, 
    (SELECT id, COUNT(secondid) as sec 
     FROM thebigtable) b, 
    (SELECT id, SUM(value) as value_sum 
     FROM thebigtable 
     GROUP BY secondid) c, 
WHERE a.id = b.id 
AND a.id = c.id 
Смежные вопросы