我有以下 MySQL 表:
+---------+------------+------+--------+------+---------+------------+-------+---------+----------+------------+------------+ | Version | Yr_Varient | FY | Period | CoA | Company | Item | Mvt | Ptnr_Co | Investee | GC | LC | +---------+------------+------+--------+------+---------+------------+-------+---------+----------+------------+------------+ | 201 | 1 | 2010 | 1 | 11 | 23 | 1110105000 | 60200 | | | 450000 | 450000 | | 201 | 1 | 2010 | 1 | 11 | 23 | 2110300000 | 60200 | | | -520000 | -520000 | | 201 | 1 | 2010 | 1 | 11 | 23 | 1220221600 | | | | 78080 | 78080 | | 201 | 1 | 2010 | 1 | 11 | 23 | 2130323000 | | | | 50000 | 50000 | | 201 | 1 | 2010 | 1 | 11 | 23 | 2130322000 | | | | -58080 | -58080 | | 201 | 1 | 2010 | 1 | 11 | 23 | 3100505000 | | | | -275000 | -275000 | | 201 | 1 | 2010 | 1 | 11 | 23 | 3200652500 | | | | 216920 | 216920 | | 201 | 1 | 2010 | 1 | 11 | 23 | 3900000000 | | | | 58080 | 58080 | | 201 | 1 | 2010 | 1 | 11 | 26 | 1110105000 | 60200 | | | 376000 | 376000 | | 201 | 1 | 2010 | 1 | 11 | 26 | 2110300000 | 60200 | | | -545000 | -545000 | | 201 | 1 | 2010 | 1 | 11 | 26 | 1220221600 | | | | 452250 | 452250 | | 201 | 1 | 2010 | 1 | 11 | 26 | 2130323000 | | | | -165000 | -165000 | | 201 | 1 | 2010 | 1 | 11 | 26 | 2130322000 | | | | -118250 | -118250 | | 201 | 1 | 2010 | 1 | 11 | 26 | 3100505000 | | | | -937750 | -937750 | | 201 | 1 | 2010 | 1 | 11 | 26 | 3200652500 | | | | 819500 | 819500 | | 201 | 1 | 2010 | 1 | 11 | 26 | 3900000000 | | | | 118250 | 118250 | | 201 | 1 | 2010 | 1 | 11 | 37 | 1110105000 | 60200 | | | 777000 | 777000 | | 201 | 1 | 2010 | 1 | 11 | 37 | 2110308000 | 60200 | 43 | | -255000 | -255000 | | 201 | 1 | 2010 | 1 | 11 | 37 | 2130321500 | | | | 180000 | 180000 | | 201 | 1 | 2010 | 1 | 11 | 37 | 2130322000 | | | | -77000 | -77000 | | 201 | 1 | 2010 | 1 | 11 | 37 | 2310407001 | | 1 | | -625000 | -625000 | | 201 | 1 | 2010 | 1 | 11 | 37 | 3100505000 | | | | -2502500 | -2502500 | | 201 | 1 | 2010 | 1 | 11 | 37 | 3200652500 | | | | 2425500 | 2425500 | | 201 | 1 | 2010 | 1 | 11 | 37 | 3900000000 | | | | 77000 | 77000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1110105000 | 60200 | | | 2600000 | 2600000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1140161000 | 60200 | | 23 | 430000 | 430000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1140161000 | 60200 | | 26 | 505556 | 505556 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1140160000 | 60200 | 37 | | 255000 | 255000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1160163000 | 60200 | 99999 | 48 | 49428895 | 49428895 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1160163000 | 60200 | 99999 | 49 | 188260175 | 188260175 | | 201 | 1 | 2010 | 1 | 11 | 43 | 2310405500 | | | | -237689070 | -237689070 | | 201 | 1 | 2010 | 1 | 11 | 43 | 2110300000 | 60200 | | | -1000 | -1000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 2110300500 | 60200 | | | -3999000 | -3999000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 1220221600 | | | | 1571112 | 1571112 | | 201 | 1 | 2010 | 1 | 11 | 43 | 2130321500 | | | | -805556 | -805556 | | 201 | 1 | 2010 | 1 | 11 | 43 | 2130322000 | | | | -556112 | -556112 | | 201 | 1 | 2010 | 1 | 11 | 43 | 3100505000 | | | | -836000 | -836000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 3200652500 | | | | 781000 | 781000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 3300715700 | | 99999 | 32 | -440000 | -440000 | | 201 | 1 | 2010 | 1 | 11 | 43 | 3300715700 | | 99999 | 26 | -61112 | -61112 | | 201 | 1 | 2010 | 1 | 11 | 43 | 3900000000 | | | | 556112 | 556112 | +---------+------------+------+--------+------+---------+------------+-------+---------+----------+------------+------------+
我需要获取 Mvt = 60200 的所有行,并将该行中的每个 GC 和 LC 记录乘以 1.1,然后将包含更改的新行添加回同一个表,并将 FY 设置为 2011。
如何在 1 条语句中完成所有这些操作?
是否有可能在 1 条语句中完成所有这些(我对 SQL 知之甚少)?
这可以在标准 SQL 中完成,因为数据库将被移植到另一个数据库服务器吗?
我不知道它将是哪个服务器。
最佳答案
在标准 SQL 中(在特定于供应商的实现中可能有更好的方法,但我倾向于在可能的情况下更喜欢标准的东西):
insert into mytable (
Version, Yr_Varient, Period, CoA, Company, Item, Mvt, Ptnr_Co, Investee,
FY, GC, LC
) select
Version, Yr_Varient, Period, CoA, Company, Item, Mvt, Ptnr_Co, Investee,
2011, GC*1.1, LC*1.1
from mytable
where Mvt = 60200
-- and FY = 2010
您可能还想根据测试结果稍微限制您的 select 语句,例如取消注释上面的 and FY = 2010
行以停止复制所有 2009 年和 2008 年的数据好吧,如果有的话。我假设您只想继承前一年的内容,在 GC
和 LC
上增加 10%。
它的工作方式是运行 select
,它为 FY
、GC
和 LC
提供修改后的数据根据您的要求,将所有这些行抽回 insert
。
关于sql - 我如何在一条语句中的 SQL 中执行此操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713484/