【问题标题】:Updating one column based on the value of another column根据另一列的值更新一列
【发布时间】:2015-08-19 17:51:53
【问题描述】:

我有一个名为 Vendor 的表,在这个表中我有一个名为 AccountTerms 的列,它只显示一个值(即 0、1、2、3)等等。我还有一个我想使用的列 (ulARAgeing) 以反映该值的含义,例如:

0: Current
1: 30 Days
2: 60 Days

等等……

我需要一个脚本来查看 AccountTerms 中的值,然后更新 ulARAgeing 以显示上面显示的单词值。我该怎么做?

【问题讨论】:

  • 只是为了说清楚。 AccountTerms 和 ulARAgeing 属于同一张表?你能描述一下你的表格结构吗?
  • "update ulARAgeing" 值在哪里?另一张桌子?通过表格完成一次更新?

标签: sql sql-server sql-server-2012


【解决方案1】:

我将尝试以尽可能简单的方式解释这一点,以便于理解:

假设,您有一个表 Vendor 设置如下:

create table Vendor (AccountTerms int, ulARAgeing varchar(50));

然后,我们将为Vendor 表中的两列插入一些示例值:

insert into Vendor values
(0,'Test'),
(1,'Test1'),
(2,'Test2');

接下来,我们将编写一条更新语句,根据同一张表中AccountTerms 列中的值更新您的ulARAgeing 列:

update vendor 
set ulARAgeing = (CASE 
                      WHEN AccountTerms = 0 
                        THEN 'Current'
                      WHEN AccountTerms = 1
                        THEN '30 Days'
                      WHEN AccountTerms = 2
                        THEN '60 Days'
                    END);

CASE WHEN 类似于在大多数其他编程语言中使用IF..ELSE 语句。因此,在这里我们将根据 case when 语句中的条件将现有的 ulARAgeing 值更新为不同的字符串值。所以,例如如果是AccountTerms = 0,那么我们会将ulARAgeing 的值更新为`Current'等等。

要检查上面的语句是否正常工作,你只需要运行上面的更新语句,然后再次从表中选择:

 select * from Vendor; 

结果:

+--------------+-----------------+
| AccountTerms |   ulARAgeing    |
+--------------+-----------------+
|            0 |         Current |
|            1 |         30 Days |
|            2 |         60 Days |
+--------------+-----------------+

SQL Fiddle Demo

【讨论】:

  • 如果表中有超过3条记录?他要为此写很多案例?
  • @AndrewPaes 我没有在任何地方读到他有more than 3 records 的问题。此外,即使他有 1..2...或 1000 条具有相同 AccountTerms 的记录又有什么关系?
  • "(即0、1、2、3)等"..."如:等..."
  • @AndrewPaes 抱歉,这没有任何意义。据我了解,他的意思是他在AccountTerms 列中具有诸如0、1、2、3 之类的值……等等。也许,我可能没有正确理解它。
  • 嗨,伙计们,这个对我来说效果最好(主要是因为我能理解它),它完全符合我的需要......
【解决方案2】:

假设你想要一个简单的脚本来更新,那么它会是这样的:

update 
Vendor 
set ulARAgeing = 'Current' 
where AccountTerms = 0;

假设您需要一个脚本,它会根据数字级数的逻辑自动更新列。那么它会是这样的:

;WITH CTE
     AS (select
            AccountTerms
            ,ulARAgeing
            ,CONCAT((AccountTerms * 30), ' Days') as _ulARAgeing
          from
            Vendor)
UPDATE CTE
SET    ulARAgeing = _ulARAgeing;

如果“ulARAgeing”的值偶然来自另一个表,那么脚本使用“; WITH”,你必须使用连接来获得正确的值,而不是使用渐进逻辑。

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多