【问题标题】:I want two tables calculate我要两张表计算
【发布时间】:2020-04-06 01:24:45
【问题描述】:

我想使用 2 个表中的数据进行相加和计算。

我想要的结果如下。

但是,如果我发送如下查询:

SELECT COUNT(IF(treatment_fees_check_division = 'test', treatment_fees_check_division, NULL)) AS COUNT, SUM(CASE WHEN treatment_fees_check_division = '测试' THEN treatment_fees_difference END) + SUM(advenced_amount) AS if_treatment_fees_check_division, SUM(advenced_amount) 作为 sum_init_amount FROM ( SELECT treatment_fees_check_division,treatment_fees_difference, advenced_amount FROM hospital_payment_data,advenced_pa​​yment WHERE hospital_payment_data.id = advenced_pa​​yment.chart_num ) 作为一个

会出现这些结果。

创建医院支付数据和数据表

  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
    ;

创建advenced_pa​​yment和数据表

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 ;

如何修复我的查询??

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    您的查询有很多问题。这不会解决您的问题,但我建议将其写为:

    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;
    

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 2021-02-02
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      相关资源
      最近更新 更多