0

我有这个示例表结构和记录:

-- ------------------
-- 驱动表结构
-- ------------------
如果存在“驱动程序”,则删除表;
创建表`驱动程序`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fullname` varchar(100) 整理 utf8_unicode_ci NOT NULL,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=4 默认字符集=utf8 COLLATE=utf8_unicode_ci;

-- ------------------
--taxi的表结构
-- ------------------
如果存在 `taxi` 则删除表;
创建表`taxi`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `unit` varchar(5) NOT NULL,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=4 默认字符集=latin1;

-- ------------------
-- 债务表结构
-- ------------------
如果存在“债务”,则删除表;
创建表`债务`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data` float(10,2) NOT NULL DEFAULT '0.00',
  `driver` bigint(20) NOT NULL,
  `dateadded` 日期时间不为空,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=22 默认字符集=latin1;

-- ------------------
-- 调度表结构
-- ------------------
如果存在`dispatch`,则删除表;
创建表`调度`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `driver` int(11) NOT NULL,
  `taxi` int(11) NOT NULL,
  `dispatchdate` 日期 DEFAULT NULL,
  `率`浮动默认'0',
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=1790 默认字符集=latin1;

-- ------------------
-- 还款表结构
-- ------------------
如果存在 `rpayment`,则删除表;
创建表`rpayment`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `dateadded` 日期时间默认为 NULL,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=88 默认字符集=latin1;

-- ------------------
-- rpayment_detail 的表结构
-- ------------------
删除表如果存在`rpayment_detail`;
创建表`rpayment_detail`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `rpayment` bigint(20) 非空,
  `dispatch` bigint(20) NOT NULL,
  `金额`浮动默认'0',
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=56 默认字符集=latin1;

-- ------------------
-  记录
-- ------------------

插入“驱动程序”值('1','DRIVER1');
插入“驱动程序”值('2','DRIVER2');
插入“驱动程序”值('3','DRIVER3');

插入“出租车”值('1','UNIT1');
插入“出租车”值('2','UNIT2');
插入“出租车”值('3','UNIT3');

插入“债务”值('1','100.00','1','2012-04-01 16:07:15');
插入“债务”值('2','200.00','1','2012-04-01 16:25:56');
插入“债务”值('3','300.00','3','2012-04-01 16:34:42');
插入“债务”值('4','400.00','2','2012-04-02 00:11:10');
插入“债务”值('5','200.00','1','2012-04-02 00:57:58');
插入“债务”值(“6”、“500.00”、“3”、“2012-04-02 10:25:39”);
插入“债务”值('7','100.00','2','2012-04-02 11:15:25');

插入“调度”值(“1”、“1”、“1”、“2012-04-01”、“1000”);
插入“调度”值(“2”、“2”、“2”、“2012-04-01”、“1000”);
插入“调度”值(“3”、“3”、“3”、“2012-04-01”、“1000”);
插入“调度”值(“4”、“1”、“1”、“2012-04-02”、“1000”);
插入“调度”值(“5”、“2”、“2”、“2012-04-02”、“1000”);
插入“调度”值(“6”、“3”、“3”、“2012-04-02”、“1000”);

插入“rpayment”值('1','2012-04-30 20:11:16');
插入“rpayment”值('2','2012-05-03 03:25:31');

插入“rpayment_detail”值(“1”、“1”、“1”、“1000”);
插入“rpayment_detail”值(“2”、“1”、“4”、“0”);
插入“rpayment_detail”值(“3”、“2”、“2”、“0”);
插入“rpayment_detail”值(“4”、“2”、“5”、“500”);

我想查看如下结果:

UNIT DRIVER RPAYMENT_TOTAL TOTAL_DEBTS
--------------------------------------------------
单元 1 驱动器 1 1000 500
单元 2 驱动器 2 500 500
单元 3 驱动器 3 0 800

我现在有这个...

SELECT    taxi.unit, driver.fullname, SUM(rpayment_detail.amount) AS rpayment_total, 
          SUM(debts.`data`) AS total_debts 
FROM      driver 
LEFT JOIN debts ON (driver.id = debts.driver) 
LEFT JOIN dispatch ON (driver.id = dispatch.driver) 
LEFT JOIN rpayment_detail ON (dispatch.id = rpayment_detail.dispatch) 
LEFT JOIN rpayment ON (rpayment_detail.rpayment = rpayment.id) 
LEFT JOIN taxi ON (dispatch.taxi = taxi.id) 
GROUP BY  driver.id 
ORDER BY  taxi.unit asc, driver.fullname asc

结果是……

UNIT DRIVER RPAYMENT_TOTAL TOTAL_DEBTS
--------------------------------------------------
单元 1 驱动器 1 3000 1000.00
单元 2 驱动器 2 1000 1000.00
UNIT3 驱动程序 3 空 1600.00
4

1 回答 1

0

它不能用你拥有的表结构来完成。

您的问题是debts需要一个外键列dispatch而不是driver.

如果没有这个,每次调度都会加入每笔债务,有效地将债务数量乘以司机的调度数量,这就是你所看到的。

于 2012-05-04T19:09:02.007 回答