2014-09-19 6 views
0

Сценарий: У меня есть 2 таблицы запросов 1, просто нужно просмотреть оба результата запроса как результат одного запроса.Как объединить два результата запроса?

Детали: Стол: loantrans

+-----+----------+---------+---------+---------+ 
| tid | date | account | purpose | out | 
+-----+----------+---------+---------+---------+ 
| 1 |2014-08-12| 975 | Loan | 5000 | 
| 2 |2014-08-12| 975 |Interest | 850 | 
| 3 |2014-08-12| 975 | Loan | 150 | 
| 4 |2014-08-12| 975 |Interest | 5000 | 
+-----+----------+---------+---------+---------+ 

Запрос 1:

SELECT MONTH(`loantrans`.`date`) as month, SUM(`loantrans`.`out`) AS loanout 
      FROM loantrans 
      WHERE (`loantrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
      AND (`loantrans`.`purpose` = 'Loan') 
      GROUP BY MONTH(`loantrans`.`date`) 
      ORDER BY `loantrans`.`date` 

Результат:

+-------+---------+ 
| month | loanout | 
+-------+---------+ 
| 1 | 28000 | 
| 2 | 27000 | 
| 3 | 10200 | 
| 4 | 7000 | 
| 5 | 95000 | 
| 6 | 2000 | 
+-------+---------+ 

Запрос 2:

SELECT MONTH(`loantrans`.`date`) as month, SUM(`loantrans`.`out`) AS intout 
      FROM loantrans 
      WHERE (`loantrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
      AND (`loantrans`.`purpose` = 'Interest') 
      GROUP BY MONTH(`loantrans`.`date`) 
      ORDER BY `loantrans`.`date` 

Результат:

+-------+---------+ 
| month | intout | 
+-------+---------+ 
| 1 | 2000 | 
| 2 | 750 | 
| 3 | 200 | 
| 4 | 180 | 
| 5 | 570 | 
| 6 | 625 | 
+-------+---------+ 

То, что я хочу, как

+-------+---------+---------+ 
| month | intout | loanout | 
+-------+---------+---------+ 
| 1 | 2000 | 28000 | 
| 2 | 750 | 27000 | 
| 3 | 200 | 10200 | 
| 4 | 180 | 7000 | 
| 5 | 570 | 95000 | 
| 6 | 625 | 2000 | 
+-------+---------+---------+ 

Как получить результат, как это ???

Пожалуйста, проверьте этот скриншот для более четкого представления о том, что я ищу https://www.dropbox.com/s/dpptqb7y4c6xzi5/Capture3.PNG?dl=0 База данных: https://www.dropbox.com/s/8gbgrgvil915efr/bankdb.sql_7.zip?dl=0

+0

Все условия на 'where' положение одинаковы? Или они меняются? – ssedano

+0

@ssedano В этом примере «loantrans». «Цель» варьируется между запросами – Grice

ответ

1
SELECT MONTH(lt.date) month, 
     SUM(case when lt.purpose='Interest' then lt.out else 0 end) intout, 
     SUM(case when lt.purpose='Loan' then lt.out else 0 end) loanout 
    FROM loantrans lt 
    WHERE lt.date BETWEEN '2014-01-01' AND '2014-09-20' 
GROUP BY month 
ORDER BY month 

http://sqlfiddle.com/#!2/fa8ac/5

+0

Я поддержу этот ответ. Его короткий и очень ясный. +1 – paqogomez

+0

Это в основном мое, но с ненужным синтаксисом! : P – Arth

+0

@Arth Позвольте мне исправить вас. Это ваше, буквально, но объяснено. Как я уже сказал, ваш немного неясен. Вот почему я поддержал ваш ответ. Я пришел ответить именно так, но мне пришлось немного почесать голову после того, как увижу твое. Поэтому я расширяю его для OP, чтобы понять и исправить то, что я упомянул о пропавшей запятой. – Horaciux

0

Используйте это с Если Постулаты

SELECT MONTH(l.date) month, 
    SUM(if (l.purpose='Interest' ,l.out , 0)) intout, 
    SUM(if (l.purpose='Loan', l.out ,0)) loanout 
FROM loantrans l 
WHERE l.date BETWEEN '2014-01-01' AND '2014-09-20' 
GROUP BY month 
ORDER BY month 
+0

Если вы заметили в запросе OP, то вы ищете 'Loan', другой ищет' Interest'. Я думаю, вы упустили интерес. – paqogomez

+0

Как это могло быть на 2 голоса? это не работает. Уберите или исправьте этот ответ – Horaciux

2
SELECT MONTH(lt.date) month, 
     SUM((lt.purpose='Interest')*lt.out) intout, 
     SUM((lt.purpose='Loan')*lt.out) loanout 
    FROM loantrans lt 
    WHERE lt.date BETWEEN '2014-01-01' AND '2014-09-20' 
    /* AND lt.purpose IN ('Interest', 'Loan') /* If you have more purposes. */ 
GROUP BY month 
ORDER BY month 
+0

Немного неясный, но короткий. Он выполняет свою работу. A ',' отсутствует – Horaciux

+0

http://sqlfiddle.com/#!2/fa8ac/3/0 – Donal

+0

@Donai Приветствую вас за редактирование и скрипку. – Arth

0

, вероятно, более эффективные способы, чтобы сделать это , но я думаю, что это работает:

select coalesce(tblOne.month, tblTwo.month), intOut, loanOut 
from (
     SELECT MONTH(`loantrans`.`date`) as month, SUM(`loantrans`.`out`) AS loanout 
     FROM loantrans 
     WHERE (`loantrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
     AND (`loantrans`.`purpose` = 'Loan') 
     GROUP BY MONTH(`loantrans`.`date`) 
) tblOne 
left join (
     SELECT MONTH(`loantrans`.`date`) as month, SUM(`loantrans`.`out`) AS intout 
     FROM loantrans 
     WHERE (`loantrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
     AND (`loantrans`.`purpose` = 'Interest') 
     GROUP BY MONTH(`loantrans`.`date`) 
) tblTwo on tblOne.month = tblTwo.month 
order by month 
0
SELECT l1.month, l1.loanout, l2.intout FROM (
    SELECT MONTH(`loantrans`.`date`) as month, SUM(`loantrans`.`out`) AS loanout 
     FROM loantrans 
     WHERE (`loantrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
     AND (`loantrans`.`purpose` = 'Loan') 
     GROUP BY MONTH(`loantrans`.`date`) 
     ORDER BY `loantrans`.`date` 
    ) AS l1 JOIN (
    SELECT MONTH(`loantrans`.`date`) as month, SUM(`loantrans`.`out`) AS intout 
     FROM loantrans 
     WHERE (`loantrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
     AND (`loantrans`.`purpose` = 'Interest') 
     GROUP BY MONTH(`loantrans`.`date`) 
     ORDER BY `loantrans`.`date` 
    ) AS l2 ON l1.month = l2.month; 
+0

Обратите внимание, что с внутренним соединением, если эти значения существуют в одном списке, но не в другом, этот конкретный месяц не будет выводиться – Kritner

+0

@ Kritner Я должен был указать это. Ваш ответ лучше. – Zereges

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