首页 > 解决方案 > (SSMS) SQL:如果在同一列中,则使用 CASE 获取一个人的“年龄”(作为数字)和“RIP”(作为文本)如果死在同一列中

问题描述

[已解决] https://stackoverflow.com/a/66287009/7657958

抱歉,如果这个问题是重复的。现在花了3小时尝试各种方法来解决我的问题,但无济于事!任何帮助表示赞赏!

PROGRAM: Microsoft SQL Server Management Studio
EXPERIENCE: 2-3 weeks (Beginner)

PROGRAM VERSION:
SQL Server Management Studio               15.0.18369.0
SQL Server Management Objects (SMO)        16.100.46041.41
Microsoft Analysis Services Client Tools   15.0.19342.0
Microsoft Data Access Components (MDAC)    10.0.18362.1
Microsoft MSXML                            3.0 6.0 
Microsoft .NET Framework                   4.0.30319.42000
Operating System                           10.0.18363

我正在尝试根据一个人的生命状况自动填充年龄列。为此,我有一个名为Vital status的(使用 varchar),它显示表中每个人的状态ALIVEDECEASED。如果此人还活着,他/她的年龄(一个数字)应该显示在Age 列中(使用 varchar)。但是,如果此人已死,则应改为显示 RIP(文本)。年龄基于人的出生年份,为此我有一个单独的列 Born(使用 int)显示年份。

Example: the result should look like this.

--------------------------------------------------
  ID  |   Name   | Born  | Vital status |   Age  |
--------------------------------------------------
  1   |  Arnold  | 1992  |    Alive     |    29  |
  2   |  Bruce   | 1952  |    Deceased  |  R.I.P |
  3   |  Arnie   | 1972  |    Deceased  |  R.I.P |
  4   |  Bruno   | 1962  |    Deceased  |    58  |

这是我最近的尝试:

insert into My_Family_Tree (Age)
VALUES(
CASE
WHEN [Vital status] = 'Deceased' THEN 'R.I.P'
ELSE CONVERT(varchar(30), DATEDIFF(year, Born, 2021))
END)

这给了我关于 [Vital status] 和 Born 的错误,说无效的列。但是它们都存在于我的表中。我也试过扭转这个:

insert into My_Family_Tree (Age)
VALUES(
CASE
WHEN 'Vital status' = 'Alive' THEN CONVERT(varchar(30), DATEDIFF(year, 'Birthday', 2020))
ELSE 'RIP'
END)

标签: sqlsql-servercase

解决方案


首先,我认为你想要一个update. 其次,你没有出生日期。你只有一年。

所以,我想你想要:

update My_Family_Tree
    set Age = (CASE WHEN [Vital status] = 'Deceased'
                    THEN 'R.I.P'
                    ELSE CONVERT(varchar(30), 2021 - Born)
               END)

推荐阅读