SQL技术问询:拆分CustomerFname为Title列+查询超1年贷款数据
解决客户头衔拆分与贷款时长筛选问题
原ALTER TABLE语句的错误
你写的ALTER TABLE语句完全混淆了表结构修改和数据查询的语法:
ALTER TABLE仅用于添加/删除列、修改列属性等表结构操作,不能直接结合SUBSTRING和FROM子句来提取数据。- 另外SQL Server中
SUBSTRING的起始索引是从1开始的,用0作为起始位会导致截取结果异常。
分步实现需求
1. 新增Title列
首先给Loan表添加存储头衔的Title列:
ALTER TABLE [dbo].[Loan] ADD Title VARCHAR(10);
2. 拆分CustomerFname中的头衔到Title列
不要用固定长度截取(比如硬取前4位),因为不同头衔长度不同(Mr是2位、Mrs是3位、Dr是2位),推荐用空格分割的方式精准提取:
UPDATE [dbo].[Loan] SET Title = LEFT(CustomerFname, CHARINDEX(' ', CustomerFname) - 1) WHERE CHARINDEX(' ', CustomerFname) > 0;
如果你的数据里头衔和名字之间没有空格,或者需要精准匹配已知头衔,也可以用条件判断的方式:
UPDATE [dbo].[Loan] SET Title = CASE WHEN CustomerFname LIKE 'Mrs%' THEN 'Mrs' WHEN CustomerFname LIKE 'Mr%' THEN 'Mr' WHEN CustomerFname LIKE 'Dr%' THEN 'Dr' ELSE NULL END WHERE CustomerFname LIKE 'Mr%' OR CustomerFname LIKE 'Mrs%' OR CustomerFname LIKE 'Dr%';
3. 查询贷款时长超过1年的客户数据
最后执行查询,筛选出贷款时长超过1年的记录(这里用DATEDIFF计算时间差,你可以根据实际需求调整时间计算逻辑):
SELECT Title, CustomerFname, CustomerLname, City, [State], LoanDate FROM [dbo].[Loan] WHERE DATEDIFF(day, LoanDate, GETDATE()) > 365;
如果需要按自然年计算(比如贷款满1个整年),可以改用:
WHERE DATEDIFF(year, LoanDate, GETDATE()) >= 1;
内容的提问来源于stack exchange,提问作者the Noble One Cometh
相关产品推荐
相关产品推荐

