MySQL 多列总和脚本

Posted

技术标签:

【中文标题】MySQL 多列总和脚本【英文标题】:MySQL Sum of multiple columns script 【发布时间】:2020-11-23 07:07:18 【问题描述】:

抱歉,我是 mysql 的初学者,我需要尽快获得帮助。 所以,我有 2 张桌子

程序目录:

idProcedure INT(PRIMARY KEY)
ProcedureName VARCHAR(45)
ProcedureCost DOUBLE
ProcedureTax DOUBLE
TotalCost DOUBLE AS ProcedureTax+ProcedureCost

病人预约:

idAppointment INT(PRIMARY KEY)
idProcedure1 INT 
idProcedure2 INT 
idProcedure3 INT
idProcedure4 INT 
idProcedure5 INT
TotalCost DOUBLE

所以,问题如下: 每个患者预约最多可以有 5 个医疗程序(例如,如果只有 3 个,则前 3 个 idProcedure 将具有程序的 id,其余的将为 NULL )。我尝试将 PatientAppointment 中的 5 个 id 作为 ProcedureCatalogue 中 idProcedure 的外键,但它似乎不起作用(我使用的是最新版本的 MySQL Workbench,当我尝试为 idProcedure 选择列时,没有ProcedureCatalogue 中的列),但这不是真正的问题,因为它可以在插入数据时使用正确的信息完成。

我需要做的但我真的不知道如何制作一个脚本,将 PatientAppointment 的 TotalCost 作为每个程序的 TotalCost 的总和。

例如,如果您有 2 个程序(最多可有 5 个(来自 PatientAppointment 的 idProcedure 与来自 ProcedureCatalog 的 idProcedure 对应))

你会得到类似的东西: 程序目录:

   id ProcedureName  ProcedureCost  ProcedureTax  TotalCost
    1 procedure1          20            30           50
    2 procedure2          40            60          100
    3 procedure3          1              1            2
    4 procedure4          5              5           10
    5 procedure5         25             30           55

对于 PatientAppointment:

idAppointment      id1   id2   id3  id4  id5  TotalCost  
      1             1     3    NULL NULL NULL     52 
      2             2     4     5   NULL NULL     165
      3             4    NULL  NULL NULL NULL     10
      4             1     2     3    4    5       217

所以,请帮助我填写 PatientAppointment 中的 TotalCost 的脚本,我试图在过去 6 个小时内完成它,但我没有运气:(。

【问题讨论】:

如果我想要第六次手术怎么办,而且钱很少双倍;这就是发明 DECIMAL 的原因。 @Strawberry 这是更大的大学作业的一部分,我正在使用提供给我的数据类型。 好吧,我只能说,如果是我,我会先修复架构,使用适当的数据类型和规范化设计。 @Strawberry 你能给我一些建议吗(我说过我是 MySql 的初学者) 任何时候你发现自己有枚举的列名(例如,2),你可以确定你的设计是次优的。约会以及在该约会时应进行的程序的详细信息是两件不同的事情,属于两个单独的表格。 【参考方案1】:
UPDATE PatientAppointment pa
LEFT JOIN ProcedureCatalogue pc1 ON pa.idProcedure1 = pc1.idProcedure
LEFT JOIN ProcedureCatalogue pc2 ON pa.idProcedure2 = pc2.idProcedure
LEFT JOIN ProcedureCatalogue pc3 ON pa.idProcedure3 = pc3.idProcedure
LEFT JOIN ProcedureCatalogue pc4 ON pa.idProcedure4 = pc4.idProcedure
LEFT JOIN ProcedureCatalogue pc5 ON pa.idProcedure5 = pc5.idProcedure
SET pa.TotalCost =   COALESCE(pc1.TotalCost, 0)
                   + COALESCE(pc2.TotalCost, 0)
                   + COALESCE(pc3.TotalCost, 0)
                   + COALESCE(pc4.TotalCost, 0)
                   + COALESCE(pc5.TotalCost, 0);

fiddle

【讨论】:

以上是关于MySQL 多列总和脚本的主要内容,如果未能解决你的问题,请参考以下文章

MySQL计算多列上的不同值

在 knexjs mysql 中取联合多列后总和不起作用

选择多列时,脚本(while-loop)停止并且没有输出

Codeigniter 获取玩家已完成的目标总和

Mysql第五期 排序与分页

需要一种将多列动态汇总为不同高度的合并单元格的方法