在SQL Server中添加具有两种数据类型的列

时间:2017-12-09 11:09:54

标签: sql sql-server tsql ssms

我需要达到这样的输出,任何人都可以帮助我。提前致谢

enter image description here

4 个答案:

答案 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

来源Solved Already

如果想要更多控制(字符串中的多个数字),最好创建一个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

说明(感谢外部链接人员)

  1. 获取第一个int字符(PatIndex('%[0-9 .-]%',Data))
  2. 删除所有留给int的字符(SubString(Data,PatIndex('%[0-9 .-]%',Data),8000))
  3. 查找数字结尾(选择PatIndex('%[^ 0-9 .-]%',SubString(数据,PatIndex('%[0-9 .-]%',数据)+1,8000)) )
  4. 获取所有整数 - (选择左(SubString(数据,PatIndex('%[0-9 .-]%',数据),8000),PatIndex('%[^ 0-9.-] %',SubString(数据,PatIndex('%[0-9 .-]%',数据),8000)+'X') - 1))

  5. 对字符串重复上述步骤。

答案 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中对其进行转换/求和/分组。