mysql - MySQL 使用基于另一个表值的条件进行更新
问题描述
我在 MySQL 中有两个表。我想将“总计”列的值设置为等于比率 x(如果项目以 A 开头,则表 A 列)或比率 x(如果项目以 B 开头,则表 B 列)和月份列两个表匹配。
create table zeus(id int primary key,
Month varchar(10),
Items varchar(20),
Ratio decimal(3,2),
Total decimal(10,2));
create table ares(id int primary key,
Month varchar(10),
`Value A` decimal(10,2),
`Value B` decimal(10,2));
ID | 月 | 项目 | 比率 | 全部的 |
---|---|---|---|---|
1 | 可能 | 包 | 0.50 | |
2 | 可能 | 苹果 | 0.3 | |
3 | 可能 | 瓶子 | 0.25 | |
4 | 可能 | 橡子 | 0.1 | |
5 | 可能 | 闹钟 | 0.6 | |
6 | 可能 | 瓶子 | 0.25 |
ID | 月 | 总甲 | 总乙 |
---|---|---|---|
1 | 可能 | 600 | 800 |
2 | 六月 | 780 | 400 |
我试过这个
update zeus
set Total = (CASE
WHEN Items like ('A%') and Month = 'May'
THEN Ratio * (select(ares.`Value A`)
WHERE Month = 'May')
WHEN Items like ('B%') and Month = 'May'
THEN Ratio * (select(ares.`Value B`)
WHERE Month = 'May')
END);
但我似乎无法弄清楚。
解决方案
看起来你只是想要:
update zeus
inner join ares using (Year,Month)
set zeus.Total = case
when zeus.Items like 'A%' then ares.`Value A` * zeus.Ratio
when zeus.Items like 'B%' then ares.`Value B` * zeus.Ratio
end
如果 Items 既不以 A 也不以 B 开头,这会将 Total 设置为 null;如果您希望它设置为空白或保留为现有的 zeus.Total 值,请添加一个 else 子句。
请注意,具有相关值的列名数组而不是每行一个值的单独表通常被认为是糟糕的数据库设计。
推荐阅读
- c# - Gridview行背颜色在文本更改事件Asp.net C#上没有改变
- python - Python - 无法导入`linalg`
- php - 这个 while 循环不起作用,而且时间更长,即使我给出了条件
- fortran - 使用 ifort 为派生类型重载加法时“操作无效”
- ember.js - 删除终端中显示的 Ember Handlebars 缩进错误
- bash - 向 CSV 文件添加新列
- c# - 重命名图片的副本
- sql - 如何在 PL/SQL 中捕获约束违规并给出用户定义的错误消息?
- javascript - 为父 Promise func 中的变量返回子 Promise func?
- javascript - 问题javascript函数将字符串值转换为int删除第一个零