sql - 我如何在一条语句中的 SQL 中执行此操作?

标签 sql mysql

我有以下 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 年的数据好吧,如果有的话。我假设您只想继承前一年的内容,在 GCLC 上增加 10%。

它的工作方式是运行 select,它为 FYGCLC 提供修改后的数据根据您的要求,将所有这些行抽回 insert

关于sql - 我如何在一条语句中的 SQL 中执行此操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713484/

相关文章:

PHP 没有将一些值插入 MySQL 数据库

SQL Server比较有多少数据匹配,并且只在一张表中

php - Codeigniter Ajax请求与mysql一样查询编码字符串为字符

sql - 聚合后的Elasticsearch过滤器

MySql:让这个查询更快......有办法吗?

php - 用于存储层次结构列表的 RDBMS 策略?查询/输出它们?

mysql - 一起使用 MySQL 和 Mongodb

sql - ElasticSearch:使用OR AND子句创建 bool 查询

python - 在 python 中形成 MySQL 查询的正确方法是什么?

php - 获取唯一值数组