Я хочу две таблицы рассчитать - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу добавить и рассчитать, используя данные из 2 таблиц.

Я хочу получить следующие результаты. enter image description here

Однако, если я отправлю запрос следующим образом:

SELECT COUNT (IF (treatment_fees_check_division = 'test', treatment_fees_check_division, NULL)) КАК COUNT, SUM (случай, когда treatment_fees_check_division = 'тест' ТОГДА treatment_fees_difference КОНЕЦ) + SUM (advenced_amount) А.С. if_treatment_fees_check_division, СУММА (advenced_amount) КАК sum_init_amount ОТ (SELECT treatment_fees_check_division, treatment_fees_difference, advenced_amount ОТ hospital_payment_data, advenced_payment ГДЕ hospital_payment_data.id = advenced_payment.chart_num ) КАК

Эти результаты встречаются.

enter image description here

создать таблицу hospital_payment_data и data

  CREATE TABLE `hospital_payment_data` (
        `id` INT(11) NOT NULL AUTO_INCREMENT,
        `date` TIMESTAMP NOT NULL DEFAULT current_timestamp(),
        `chart_num` INT(11) NOT NULL ,
        `chart_name` VARCHAR(50) NOT NULL,
        `visit` DATE NOT NULL,
        `non_payment_sales` VARCHAR(50) NOT NULL,
        `total_medical_bills` VARCHAR(50) NOT NULL,
        `total_amount` VARCHAR(50) NOT NULL,
        `amount_asked` VARCHAR(50) NOT NULL,
        `medical_bills_payment` VARCHAR(50) NOT NULL,
        `personal_liability_amount` VARCHAR(50) NOT NULL,
        `non_payment` VARCHAR(50) NOT NULL,
        `insurance_division` VARCHAR(50) NOT NULL,
        `division` VARCHAR(50) NOT NULL,
        `cash_amount_received` VARCHAR(50) NOT NULL,
        `cash_receipt` VARCHAR(50) NOT NULL,
        `cash_receipt_non_payment` VARCHAR(50) NOT NULL,
        `cash_receipt_payment` VARCHAR(50) NOT NULL,
        `card_amount_received` VARCHAR(50) NOT NULL,
        `card_non_payment` VARCHAR(50) NOT NULL,
        `card_payment` VARCHAR(50) NOT NULL,
        `medical_bills_check` VARCHAR(50) NOT NULL,
        `medical_bills_check_modify` VARCHAR(50) NOT NULL DEFAULT 'N',
        `treatment_fees_difference` VARCHAR(50) NOT NULL,
        `init_amount` VARCHAR(50) NOT NULL DEFAULT '0',
        `treatment_fees_check_division` VARCHAR(50) NOT NULL DEFAULT '-',
        `treatment_fees_check` VARCHAR(50) NOT NULL,
        `treatment_fees_check_modify` VARCHAR(50) NOT NULL DEFAULT 'N',
        `treatment_fees_check_memo` VARCHAR(50) NOT NULL,
        PRIMARY KEY (`id`)
    )
    COLLATE='euckr_korean_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=18
    ;

enter image description here

создать таблицу advenced_payment и данных

CREATE TABLE `advenced_payment` (`id` INT(11) NOT NULL AUTO_INCREMENT,
`date` TIMESTAMP NULL DEFAULT NULL,
`chart_num` VARCHAR(50) NULL DEFAULT NULL,
`chart_name` VARCHAR(50) NULL DEFAULT NULL,
`advenced_amount` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `chart_num` (`chart_num`)) COLLATE='euckr_korean_ci' ENGINE=InnoDB AUTO_INCREMENT=2 ;

enter image description here

Как исправить мой запрос ??

1 Ответ

0 голосов
/ 06 апреля 2020

У вас есть многочисленные проблемы с вашим запросом. Это не решит ваши проблемы, но я рекомендую записать его так:

SELECT SUM(hpd.treatment_fees_check_division = 'test') AS COUNT,
       (SUM(CASE WHEN hpd.treatment_fees_check_division = 'test' THEN hpd.treatment_fees_difference END) +
        SUM(advenced_amount)
       ) AS if_treatment_fees_check_division,
       SUM(advenced_amount) AS sum_init_amount
FROM hospital_payment_data hpd JOIN
     advanced_payment ap
     ON hpd.id = ap.chart_num;

Это упрощает и устраняет некоторые проблемы:

  • JOIN использует правильные, явные, стандарт , читаемый синтаксис. Никогда не используйте запятые в предложении FROM.
  • Подзапрос совершенно не нужен и, вероятно, отрицательно влияет на производительность.
  • Все таблицы имеют псевдонимы таблиц.
  • Все ссылки на столбцы квалифицированы.
  • Счет условий значительно упрощается при использовании sum(<boolean>).

Я отмечаю, что treatment_fees_difference - строка, но вы используете SUM() , Это действительно очень плохо.

В любом случае, ваша проблема в том, что в одной из таблиц есть несколько строк. Трудно понять, какой из них, но я думаю, advanced_payment. Решение заключается в предварительной агрегации до JOIN:

SELECT SUM(hpd.treatment_fees_check_division = 'test') AS COUNT,
       (SUM(CASE WHEN hpd.treatment_fees_check_division = 'test' THEN hpd.treatment_fees_difference END) +
        SUM(ap.sum_init_amount)
       ) AS if_treatment_fees_check_division,
       SUM(ap.sum_init_amount) AS sum_init_amount
FROM hospital_payment_data hpd JOIN
     (SELECT ap.chart_num, COUNT(*) as cnt, SUM(advenced_amount) as sum_init_amount
      FROM advanced_payment ap
      GROUP BY ap.chart_num
     ) ap
     ON hpd.id = ap.chart_num;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...