基于条件的值之和

时间:2017-10-13 11:12:39

标签: mysql

我是mysql的新手 我有两张桌子,

CREATE TABLE `tab1` (
  `tid1` int(2) NOT NULL auto_increment,
  `payer` varchar(100) default NULL,
  `receiver` varchar(100) default NULL,
  `payAmt` decimal(20,2) default '0.00',
  `recAmt` decimal(20,2) default '0.00',
  PRIMARY KEY  (`tid1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

-

- 转储表tab1

的数据
INSERT INTO `tab1` (`tid1`, `payer`, `receiver`, `payAmt`, `recAmt`) VALUES 
(1, 'aaa', 'bbb', 100.00, -100.00),
(2, 'aaa', 'ccc', 200.00, -200.00),
(3, 'bbb', 'aaa', 150.00, -150.00),
(4, 'ccc', 'aaa', 175.00, -175.00);

-

- 表tab2

的表结构
CREATE TABLE `tab2` (
  `tid2` int(2) NOT NULL auto_increment,
  `payer` varchar(100) default NULL,
  `receiver` varchar(100) default NULL,
  `payAmt` decimal(20,2) default '0.00',
  `recAmt` decimal(20,2) default '0.00',
  PRIMARY KEY  (`tid2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

-

- 转储表tab2

的数据
INSERT INTO `tab2` (`tid2`, `payer`, `receiver`, `payAmt`, `recAmt`) VALUES 
(1, 'ddd', 'aaa', 223.00, -223.00),
(2, 'aaa', 'bbb', 429.00, -429.00),
(3, 'ccc', 'aaa', 102.00, -102.00);

我想要的结果如下所示

name    payAmtTotal recAmtTotal payAmtTotal-recAmtTotal
aaa        729       650          79
bbb        150       529         -379
ccc        277      -277          554
ddd        223        0           223

1 个答案:

答案 0 :(得分:0)

不确定为什么有超过1个表的信息,首先出现的是尝试将其转换为1个表。

无论如何,不​​确定这是否是最好和最干净的方法如果表不是很大而你必须选择创建临时表,那么这是获得所需结果的一种方法。

CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS (SELECT * FROM `tab1`);
INSERT INTO temp1  SELECT * FROM `tab2`;

CREATE TEMPORARY TABLE IF NOT EXISTS temp2 AS (SELECT * FROM `temp1`);
CREATE TEMPORARY TABLE IF NOT EXISTS temp3 AS (SELECT * FROM `temp1`);

SELECT 
    `payer` AS `name`,
    (SELECT SUM(payAmt) AS `p` FROM temp2 AS t WHERE t.payer = temp1.payer) AS `payAmtTotal` ,
    (SELECT SUM(payAmt) AS `r` FROM temp3 AS t WHERE t.receiver = temp1.payer) AS `recAmtTotal`
FROM
   temp1
GROUP BY `name`;

基本上,您创建一个单一(临时)表,并使用两个现有表中的数据填充此表。

由于MySQL不允许您在单个查询中使用相同的临时表,因此您需要创建更多:-)它们可以是第一个的副本。

之后,对自身的选择查询并不复杂。