2

我想对 3 个表中 3 列的值求和

我的查询

SELECT sum(s.paid_money+d.paid_money+e.paid_money)
       FROM payment_dates AS dates
       LEFT JOIN supplier_payments AS s 
                ON dates.id = s.payment_date_id
       LEFT JOIN daily_payments AS d 
                ON dates.id = d.payment_date_id
       LEFT JOIN emp_payments AS e 
                ON dates.id = e.payment_date_id;

当我通过以下查询从 3 个表中选择paid_money时:

 SELECT dates.id, s.paid_money as sup, d.paid_money as daily, e.paid_money as emp  
       FROM payment_dates AS dates  
       LEFT JOIN supplier_payments AS s 
                ON dates.id = s.payment_date_id
       LEFT JOIN daily_payments AS d 
                ON dates.id = d.payment_date_id
       LEFT JOIN emp_payments AS e 
                ON dates.id = e.payment_date_id;

-输出
id sup daily emp
'1', NULL, NULL, NULL
'2', '75', '37', NULL
'2', '75', '255', NULL
'2', '669', '37'、NULL
'2'、'669'、'255'、NULL
'3'、'575'、'65'、NULL
'3'、'575'、'909'、NULL
'3'、'575 ','160', NULL'3','575','
60 ',NULL'3'
,'575','100',
NULL'3','575','624.5',NULL'3'
, '575'、'70'、NULL
'3'、'423'、'65'、NULL
'3'、'423'、'909',NULL'3
','423','160',NULL'3
','423','60',NULL'3
','423','100',NULL'3
','423' , '624.5', NULL
'3', '423', '70', NULL

  • 例如Id=2 duplicate 4 time
  • 并且 sup 的值为 75 重复两次和 669 重复两次。
  • id=3sup 的575重复7时间。
  • 我只想总结每个值中的一个
  • 像 sum(75+669+575+423)
    和最终输出
  • Like SUM(SUM(sup)+SUM(daily)+SUM(emp)) WHERE dates.pay_date ='some date'
4

2 回答 2

3

你的意思是这样的吗?

SELECT dates.id, 
((SELECT SUM(COALESCE(s.paid_money,0)) FROM supplier_payments WHERE s.payment_date_id = dates.id )+
(SELECT SUM(COALESCE(d.paid_money,0)) FROM daily_payments WHERE d.payment_date_id = dates.id ) +
(SELECT SUM(COALESCE(e.paid_money,0)) FROM emp_payments WHERE e.payment_date_id = dates.id )) as total
FROM payment_dates AS dates

如果这不是您的意思,请提供源表中数据的简要示例(即供应商付款daily_payments 和emp_payments)以及预期结果应该是什么。

更新

我已经用这样的表结构构建了一个示例数据库:

CREATE TABLE `daily_payments` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `paid_money` decimal(12,2) NOT NULL,
 `payment_date_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
);

CREATE TABLE `emp_payments` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `paid_money` decimal(12,2) DEFAULT NULL,
  `payment_date_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `payment_dates` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `pay_date` date NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `supplier_payments` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `payment_date_id` int(11) DEFAULT NULL,
  `paid_money` decimal(12,2) NOT NULL,
  PRIMARY KEY (`id`)
);

插入一些随机数据后,此查询似乎返回了您想要的输出:

SELECT id,
COALESCE((SELECT SUM(`daily_payments`.`paid_money`) FROM `daily_payments` WHERE    `payment_date_id`=`payment_dates`.id),0) + 
COALESCE((SELECT SUM(`emp_payments`.`paid_money`) FROM `emp_payments` WHERE `payment_date_id`=`payment_dates`.id),0) + 
COALESCE((SELECT SUM(`supplier_payments`.`paid_money`) FROM `supplier_payments` WHERE `payment_date_id`=`payment_dates`.id),0) as sum_of_payments
FROM payment_dates WHERE pay_date = '2012-09-23'

COALESCE 功能是为了避免在一个或多个表中找不到记录的情况下出现 NULL 值。

于 2012-09-22T04:07:37.753 回答
0

你是这个意思?

SELECT sum(s.paid_money+d.paid_money+e.paid_money)
       FROM payment_dates AS dates
       LEFT JOIN supplier_payments AS s 
                ON dates.id = s.payment_date_id
       LEFT JOIN daily_payments AS d 
                ON dates.id = d.payment_date_id
       LEFT JOIN emp_payments AS e 
                ON dates.id = e.payment_date_id;
       GROUP BY dates.id
于 2012-09-21T16:18:08.080 回答