0

私はこのサンプルテーブル構造とレコードを持っています:

-- --------------------------------
-- ドライバのテーブル構造
-- --------------------------------
DROP TABLE IF EXISTS `driver`;
CREATE TABLE `driver` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fullname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- --------------------------------
-- タクシーのテーブル構造
-- --------------------------------
DROP TABLE IF EXISTS `タクシー`;
CREATE TABLE `タクシー` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `unit` varchar(5) NOT NULL,
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

-- --------------------------------
-- 負債のテーブル構造
-- --------------------------------
DROP TABLE IF EXISTS `debts`;
CREATE TABLE `debts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data` float(10,2) NOT NULL DEFAULT '0.00',
  `driver` bigint(20) NOT NULL,
  `dateadded` datetime NOT NULL,
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=latin1;

-- --------------------------------
-- ディスパッチのテーブル構造
-- --------------------------------
DROP TABLE IF EXISTS `dispatch`;
CREATE TABLE `dispatch` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `driver` int(11) NOT NULL,
  `タクシー` int(11) NOT NULL,
  `dispatchdate` 日付 DEFAULT NULL,
  `rate` float DEFAULT '0',
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1790 DEFAULT CHARSET=latin1;

-- --------------------------------
-- 返済のためのテーブル構造
-- --------------------------------
DROP TABLE IF EXISTS `rpayment`;
CREATE TABLE `rpayment` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `dateadded` 日時 DEFAULT NULL,
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=latin1;

-- --------------------------------
-- rpayment_detail のテーブル構造
-- --------------------------------
DROP TABLE IF EXISTS `rpayment_detail`;
CREATE TABLE `rpayment_detail` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `rpayment` bigint(20) NOT NULL,
  `dispatch` bigint(20) NOT NULL,
  `amount` float DEFAULT '0',
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=latin1;

-- --------------------------------
-  記録
-- --------------------------------

INSERT INTO `driver` VALUES ('1', 'DRIVER1');
INSERT INTO `driver` VALUES ('2', 'DRIVER2');
INSERT INTO `driver` 値 ('3', 'DRIVER3');

INSERT INTO `タクシー` 値 ('1', 'UNIT1');
INSERT INTO `タクシー` 値 ('2', 'UNIT2');
INSERT INTO `タクシー` 値 ('3', 'UNIT3');

INSERT INTO `debts` VALUES ('1','100.00', '1', '2012-04-01 16:07:15');
INSERT INTO `debts` VALUES ('2','200.00', '1', '2012-04-01 16:25:56');
INSERT INTO `debts` VALUES ('3','300.00', '3', '2012-04-01 16:34:42');
INSERT INTO `debts` VALUES ('4','400.00', '2', '2012-04-02 00:11:10');
INSERT INTO `debts` VALUES ('5','200.00', '1', '2012-04-02 00:57:58');
INSERT INTO `debts` VALUES ('6','500.00', '3', '2012-04-02 10:25:39');
INSERT INTO `debts` VALUES ('7','100.00', '2', '2012-04-02 11:15:25');

INSERT INTO `dispatch` VALUES ('1', '1', '1', '2012-04-01', '1000');
INSERT INTO `dispatch` VALUES ('2', '2', '2', '2012-04-01', '1000');
INSERT INTO `dispatch` VALUES ('3', '3', '3', '2012-04-01', '1000');
INSERT INTO `dispatch` VALUES ('4', '1', '1', '2012-04-02', '1000');
INSERT INTO `dispatch` VALUES ('5', '2', '2', '2012-04-02', '1000');
INSERT INTO `dispatch` VALUES ('6', '3', '3', '2012-04-02', '1000');

INSERT INTO `rpayment` VALUES ('1', '2012-04-30 20:11:16');
INSERT INTO `rpayment` VALUES ('2', '2012-05-03 03:25:31');

INSERT INTO `rpayment_detail` VALUES ('1', '1', '1', '1000');
INSERT INTO `rpayment_detail` VALUES ('2', '1', '4', '0');
INSERT INTO `rpayment_detail` VALUES ('3', '2', '2', '0');
INSERT INTO `rpayment_detail` VALUES ('4', '2', '5', '500');

そして、次のような結果を表示したい:

ユニットドライバー 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

結果は…

ユニットドライバー RPAYMENT_TOTAL TOTAL_DEBTS
--------------------------------------------------
ユニット1 ドライバー1 3000 1000.00
ユニット2 ドライバー2 1000 1000.00
UNIT3 DRIVER3 null 1600.00
4

1 に答える 1

0

あなたが持っているテーブル構造ではできません。

あなたの問題は、の代わりにdebts外部キー列が必要なことです。dispatchdriver

これがないと、すべての負債がすべてのディスパッチに結合され、事実上、負債の数にドライバーのディスパッチの数が乗算されます。これが表示されていることです。

于 2012-05-04T19:09:02.007 に答える