2014-09-19 2 views
0

시나리오 : 두 개의 쿼리 폼 1 테이블이 있으며 쿼리 결과를 단일 쿼리 결과로보고 싶습니다.2 개의 쿼리 결과를 함께 결합하는 방법?

세부 사항 : 테이블 : 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"와 "purpose"는 쿼리에 따라 달라집니다. – 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 당신을 시정하겠습니다. 말 그대로, 당신 것이지만, 설명됩니다. 내가 말했듯이, 네가 조금 애매하다. 그래서 나는 당신의 답을 upvoted. 나는 이것에 정확하게 대답하려고 왔지만, 나는 너를 본 후에 조금 머리를 숙여야만했다. 그래서 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

조금 어둡지 만 짧습니다. 그것은 일을 끝낸다. ','이 (가) 누락되었습니다. – Horaciux

+0

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

+0

@Donai 편집 및 바이올린을 환호합니다. – Arth

0

아마 더 나은 방법을 한 Statment 경우 ,하지만이 작품을 생각 :

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

관련 문제