2014-09-20 50 views
0

场景:我有2个查询表2表,只想将两个查询结果视为单个查询结果。如何从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 | 
+-----+----------+---------+---------+---------+ 

表:fdrtrans

+-----+----------+---------+---------+---------+ 
| tid | date | account | purpose | out | 
+-----+----------+---------+---------+---------+ 
| 1 |2014-08-12| 975 | FDR | 5000 | 
| 2 |2014-08-12| 975 |Interest | 850 | 
| 3 |2014-08-12| 975 | FDR | 150 | 
| 4 |2014-08-12| 975 | Deposit | 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(`fdrtrans`.`date`) as month, SUM(`fdrtrans`.`in`) AS fdr 
      FROM fdrtrans 
      WHERE (`fdrtrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
      AND (`fdrtrans`.`purpose` = 'FDR') 
      GROUP BY MONTH(`fdrtrans`.`date`) 
      ORDER BY `fdrtrans`.`date` 

结果:

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

我想要的是像

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

如何获得导致这样???

请为我正在寻找https://www.dropbox.com/s/kn8z7z4v7sbahf0/Capture4.PNG?dl=0 数据库更清晰的概念检查这个截图:https://www.dropbox.com/s/8gbgrgvil915efr/bankdb.sql_7.zip?dl=0

回答

1

你可以只参加两个查询。使用WITH不是必需的,但它大大增强了查询对这种情况的可读性。

WITH q2 AS 
(SELECT MONTH(`fdrtrans`.`date`) as month, SUM(`fdrtrans`.`in`) AS fdr 
      FROM fdrtrans 
      WHERE (`fdrtrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
      AND (`fdrtrans`.`purpose` = 'FDR') 
      GROUP BY MONTH(`fdrtrans`.`date`) 
      ORDER BY `fdrtrans`.`date`) 
, q1 AS 
(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`) 
SELECT q1.month, q1.loanout, q2.fdr 
FROM q1 
JOIN q2 ON q1.month = q2.month 
ORDER BY q1.month 
+0

您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'q2 AS(SELECT MONTH('fdrtrans'.'date')'附近使用正确的语法','sum'('fdrtrans'.'in')AS fdr'at line 1 – Machine 2014-09-20 13:28:53

0

这应有助于:

SELECT s1.month, 
     s1.loanout, 
     s2.fdr 
    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`   
) s1 
JOIN(SELECT MONTH(`fdrtrans`.`date`) as month, SUM(`fdrtrans`.`in`) AS fdr 
     FROM fdrtrans 
     WHERE (`fdrtrans`.`date` BETWEEN '2014-01-01' AND '2014-09-20') 
      AND (`fdrtrans`.`purpose` = 'FDR') 
    GROUP BY MONTH(`fdrtrans`.`date`) 
) s2 ON s1.month = s2.month 
ORDER BY 1 
+0

#1064 - 您的SQL语法错误;查看与您的MySQL服务器版本相对应的手册,以在's1 JOIN(SELECT MONTH('fdrtrans'.'date') ('fdrtrans'.''')AS fdr'在第9行 – Machine 2014-09-20 13:31:50

+0

请再试一次...有一个缺失的右派,我纠正它。 – DirkNM 2014-09-20 13:37:34

0

在SQL联盟来选择查询的输出相结合。

select * from loantrans 
uninon 
select * from fdrtrans 
相关问题