MySQL - Почему запрос не суммирует данные того же типа, если я использую больше левого соединения? - PullRequest
0 голосов
/ 13 марта 2020

Моя схема и пример данных:

CREATE TABLE `bsbi_hedge_fund` (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `fund_name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `abn_number` varchar(13) COLLATE utf8_unicode_ci DEFAULT NULL,
  `parent_company_id` int(11) DEFAULT NULL,
  `email` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `contact_no` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
  `address_one` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `address_two` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `city_name` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `state_name` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `zip_code` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `country_tbl_id` int(11) DEFAULT NULL,
  `status` varchar(10) COLLATE utf8_unicode_ci DEFAULT 'active',
  `created_by` int(11) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL,
  `modified_by` int(11) DEFAULT NULL,
  `modified_date` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `bsbi_hedge_fund`
--

INSERT INTO `bsbi_hedge_fund` (`id`, `fund_name`, `abn_number`, `parent_company_id`, `email`, `contact_no`, `address_one`, `address_two`, `city_name`, `state_name`, `zip_code`, `country_tbl_id`, `status`, `created_by`, `created_date`, `modified_by`, `modified_date`) VALUES
(1, 'iCAP Hedge Funds', '53616271062', 1, 'icaptrading@gmail.com', '0425175887', '68 Roy Marika Street', '', 'Bonner', 'ACT', '2914', 12, 'active', 1, '2020-02-20 07:02:51', NULL, NULL);


CREATE TABLE `bsbi_company` (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `company_name` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `abn_number` varchar(13) COLLATE utf8_unicode_ci DEFAULT NULL,
  `acn_number` varchar(13) COLLATE utf8_unicode_ci DEFAULT NULL,
  `email` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `contact_no` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
  `address_one` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `address_two` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `city_name` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `state_name` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `zip_code` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `country_tbl_id` int(11) DEFAULT NULL,
  `status` varchar(10) COLLATE utf8_unicode_ci DEFAULT 'active',
  `created_by` int(11) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL,
  `modified_by` int(11) DEFAULT NULL,
  `modified_date` datetime DEFAULT NULL,
  `allocated_money` float(17,5) DEFAULT '0.00000',
  `hedge_fund_allocation` float(17,5) NOT NULL,
  `investment_class_allocation` float(17,5) NOT NULL,
  `hedge_fund_money` float(10,3) DEFAULT '0.000',
  `inv_class_money` float(10,3) DEFAULT '0.000'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `bsbi_company`
--

INSERT INTO `bsbi_company` (`id`, `company_name`, `abn_number`, `acn_number`, `email`, `contact_no`, `address_one`, `address_two`, `city_name`, `state_name`, `zip_code`, `country_tbl_id`, `status`, `created_by`, `created_date`, `modified_by`, `modified_date`, `allocated_money`, `hedge_fund_allocation`, `investment_class_allocation`, `hedge_fund_money`, `inv_class_money`) VALUES
(1, 'Investment and Capital Growth for Australian Professional ( ', '53616271062', '2123', 'abc@gmail.com', '2343', '68 Roy Marika Street', '', 'Bonner', 'ACT', '2914', 12, 'active', 1, '2020-02-20 07:01:26', 1, '2020-03-07 12:13:53', 22847.00000, 0.00000, 0.00000, 20000.000, 19000.000);


CREATE TABLE `bsbi_hedge_fund_journal` (
  `id` int(11) NOT NULL,
  `company_id` int(11) DEFAULT NULL,
  `hedge_fund_id` int(11) DEFAULT NULL,
  `amount` float(10,3) DEFAULT NULL,
  `tran_type` varchar(7) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL,
  `modified_by` int(11) DEFAULT NULL,
  `modified_date` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `bsbi_hedge_fund_journal`
--

INSERT INTO `bsbi_hedge_fund_journal` (`id`, `company_id`, `hedge_fund_id`, `amount`, `tran_type`, `created_by`, `created_date`, `modified_by`, `modified_date`) VALUES
(1, 1, 1, 20000.000, 'credit', 1, '2020-03-07 11:45:40', NULL, NULL);

CREATE TABLE `bsbi_investment_allocation_class_journal` (
  `id` int(11) NOT NULL,
  `hedge_fund_id` int(11) DEFAULT NULL,
  `investment_class_id` int(11) DEFAULT NULL,
  `amount` float(10,3) DEFAULT NULL,
  `tran_type` varchar(7) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_by` int(11) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `bsbi_investment_allocation_class_journal`
--

INSERT INTO `bsbi_investment_allocation_class_journal` (`id`, `hedge_fund_id`, `investment_class_id`, `amount`, `tran_type`, `created_by`, `created_date`) VALUES
(1, 1, 1, 18000.000, 'credit', 1, '2020-03-07 11:46:09'),
(2, 1, 1, 2000.000, 'credit', 1, '2020-03-07 12:12:02'),
(3, 1, 1, 1000.000, 'debit', 1, '2020-03-07 12:13:53');

... и одна и та же (http://sqlfiddle.com/#! 9 / 9cd46d / 2 ):

Я написал следующий запрос для извлечения некоторых данных из базы данных:

SELECT
hf.*, com.company_name company_name, com.id com_id,
IFNULL( SUM( hfc.amount ), 0 ) hedge_credit, IFNULL( SUM( hfd.amount ), 0 ) hedge_debit,
IFNULL( SUM( cjc.amount ), 0 ) class_credit, IFNULL( SUM( cjd.amount ), 0 ) class_debit

FROM bsbi_hedge_fund hf

INNER JOIN bsbi_company com ON hf.parent_company_id = com.id

LEFT JOIN bsbi_hedge_fund_journal hfc ON (hfc.hedge_fund_id = hf.id AND hfc.tran_type='credit')
LEFT JOIN bsbi_hedge_fund_journal hfd ON ( hfd.hedge_fund_id = hf.id AND hfd.tran_type = 'debit' )
LEFT JOIN bsbi_investment_allocation_class_journal cjc ON (cjc.hedge_fund_id = hf.id AND cjc.tran_type = 'credit' )
LEFT JOIN bsbi_investment_allocation_class_journal cjd ON (cjd.hedge_fund_id = hf.id AND cjd.tran_type = 'debit' )
ORDER BY hf.id ASC

Вот результат этого запроса:
result of query 1

проблема, с которой я сталкиваюсь: hedge_credit значение 20000 , но оно показывает 40000 ! аналогично class_debit равно 1000 , но оно показывает 2000

После некоторых исследований и разработок я обнаружил: bsbi_investment_allocation_class_journal таблица имеет две записи, имеющие tran_type = credit , но по какой-то неизвестной причине следующая строка моего запроса извлекает две строки, а скорее суммирует значения (и я боюсь, что то же самое произойдет с другим левым соединением если они также имеют более одной записи одного и того же типа!)

LEFT JOIN bsbi_investment_allocation_class_journal cjc ON (cjc.hedge_fund_id = hf.id AND cjc.tran_type = 'credit' )  

Если я добавлю Group By пункт к вышеуказанному запросу, то я получу:
enter image description here

Обратите внимание, что class_credit имеет два разных значения, которые должны суммироваться, но не суммируются по неизвестной причине !!

Может кто-нибудь сказать мне, что на самом деле неправильно в моем запросе, который поднимает эту проблему?
- Спасибо

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Объединения генерируют все возможные комбинации строк, которые соответствуют критериям объединения. Поскольку вы используете только hfc.hedge_fund_id = hf.id для объединения таблиц, вы дублируете строки. Если бы в общей сложности было три транзакции, каждая была бы утроена.

Вам нужно будет выбрать больше данных из таблиц, содержащих транзакции, чтобы сохранить уникальность строк: метки времени или идентификаторы транзакций. Обычно я сначала выбираю нужные мне уникальные строки, а затем присоединяю неуникальные данные (имя, страна и т. Д. c) к каждой строке.

0 голосов
/ 14 марта 2020

Я получил решение от этого: https://dba.stackexchange.com/questions/154586/sum-over-distinct-rows-with-multiple-joins

Если кто-то сталкивается с точным типом проблемы, он может проверить это решение: https://dba.stackexchange.com/questions/154586/sum-over-distinct-rows-with-multiple-joins

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...