答案 0 :(得分:0)
您可以使用right()
&如果您的数据格式始终采用指定格式
select LEFT(names, 1) [name], SUM(cast(right(names, 2) as int)) [sum] from <table>
group by LEFT(names, 1)
起作用
<a href="//facebook.com/myfacepage/" target="_blank" rel="alternate"><img src="images/facebook-logo.png" alt="" /></a></p>
答案 1 :(得分:0)
尝试以下方法:
declare @tab table (names varchar(1000))
insert into @tab
select 'a10' union select 'abc20' union select 'xyz5' union select 'b6'
select * from @tab
select names, substring(names, 1, patindex('%[0-9]%',names)-1) [name], substring(names, patindex('%[0-9]%',names), len(names)) [sum]
from @tab
感谢。
答案 2 :(得分:0)
创建一个像
这样的函数 Create Function dbo.GetNumbers(@Data VarChar(8000))
Returns VarChar(8000)
AS
Begin
Return Left(
SubString(@Data, PatIndex('%[0-9.-]%', @Data), 8000),
PatIndex('%[^0-9.-]%', SubString(@Data, PatIndex('%[0-9.-]%', @Data), 8000) + 'X')-1)
End
如果想要更多控制(字符串中的多个数字),最好创建一个CLR函数。
使用以下T-SQL获取没有函数的聚合结果:
DROP TABLE IF EXISTS #splitString
CREATE TABLE #splitString(
[columnA] [nchar](10) NULL,
[columnB] [nchar](10) NULL) ON [PRIMARY]
GO
INSERT #splitString ([columnA], [columnB]) VALUES (N'a10', NULL)
GO
INSERT #splitString ([columnA], [columnB]) VALUES (N'a05', NULL)
GO
INSERT #splitString ([columnA], [columnB]) VALUES (N'b20', NULL)
GO
INSERT #splitString ([columnA], [columnB]) VALUES (N'a5', NULL)
GO
INSERT #splitString ([columnA], [columnB]) VALUES (N'b9', NULL)
GO
select * from #splitString
select a,sum(b) from (
select
Left(
SubString([columnA], PatIndex('%[a-z.-]%', [columnA]), 8000),
PatIndex('%[^a-z.-]%', SubString([columnA], PatIndex('%[a-z.-]%', [columnA]), 8000) + 'X')-1) a,
cast (Left( SubString([columnA], PatIndex('%[0-9.-]%', [columnA]), 8000),
PatIndex('%[^0-9.-]%', SubString([columnA], PatIndex('%[0-9.-]%', [columnA]), 8000) + 'X')-1) as int) b
From #splitString )aTable group by a
说明(感谢外部链接人员)
获取所有整数 - (选择左(SubString(数据,PatIndex('%[0-9 .-]%',数据),8000),PatIndex('%[^ 0-9.-] %',SubString(数据,PatIndex('%[0-9 .-]%',数据),8000)+'X') - 1))
对字符串重复上述步骤。
答案 3 :(得分:0)
Sql(甚至适用于“a5” - Yogesh Sharma(https://stackoverflow.com/a/47727953/7505395)做了很多努力,我修好了):
select
left(names,1) as name,
sum(cast( right(names,len(names)-1) as int))
from t
group by left(names,1)
TESTDATA:
CREATE TABLE t ( names varchar(30));
INSERT INTO t ( names ) VALUES ('a10'), ('b20'), ('a5'), ('b6');
结果:
name sum
a 15
b 26
如果你需要前面一个以上的角色,你可以这样做:
select
left(n,idxFirstNum-1) as name,
sum(cast(right(n,len(n)-idxFirstNum+1) as int)) as sum
from (
select
names as n,
PatIndex('%[0-9]%', names) as idxFirstNum
from t
) as tmp
group by left(n,idxFirstNum-1)
将存储内部tableselect中每个名称的第一个数字的索引,然后在外部select中对其进行转换/求和/分组。