求用SQL计算 ‘1箱+1箱’ 的和

王思明 2013-01-11 11:12:40
1.首先结果是2
2.要求用SQL
3.‘箱’可能是个,桶等,有一个函数可以过滤
...全文
615 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
王思明 2013-01-12
  • 打赏
  • 举报
回复
謝謝樓上的,但以前的數據已經存在,以後的數據可以讓他們更改書寫方式!
csdn_风中雪狼 2013-01-12
  • 打赏
  • 举报
回复
这种情况还是不要用sql来处理
csdn_风中雪狼 2013-01-12
  • 打赏
  • 举报
回复
引用 楼主 maanshan1 的回复:
1.首先结果是2 2.要求用SQL 3.‘箱’可能是个,桶等,有一个函数可以过滤 SQL
不懂为什么非要用sql的来处理呢,
yiyishuitian 2013-01-11
  • 打赏
  • 举报
回复
先上去汉字和英文的函数

--if object_id('dbo.CHINA_STR') is not null drop FUNCTION DBO.CHINA_STR

CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100)) 
RETURNS VARCHAR(100) 
AS 
BEGIN 
WHILE PATINDEX('%[吖-座]%',@S) > 0 
SET @S = STUFF(@S,PATINDEX('%[吖-座]%',@S),1,N'') 
WHILE PATINDEX('%[a-Z]%',@S) > 0 
SET @S=stuff(@S,patindex('%[a-Z]%',@S),1,'') 
RETURN @S
END

GO

如果是第一种情况 直接 select sum( DBO.CHINA_STR(列名)) from T 就行了 如果是第二种情况 直接 select DBO.CHINA_STR(列名A)+ DBO.CHINA_STR(列名B) 如果是第三种情况 使用动态SQL

declare @sql varchar(8000)
set @sql=列名A
select @sql= 'select '+DBO.CHINA_STR(@sql)
exec(@sql)



yiyishuitian 2013-01-11
  • 打赏
  • 举报
回复
是哪种情况 情况一: 列A 1箱 2箱 还是情况二 列A 列B 1箱 2箱 还是情况三 列A 1箱+2箱
王思明 2013-01-11
  • 打赏
  • 举报
回复
可能存在1箱+1箱+1箱+1箱的情況,長度不規定! 最後寫一個函數截取,首先把漢字過濾掉 然後剩餘1+1+1
FelixOu 2013-01-11
  • 打赏
  • 举报
回复
如果是unicode 就先rtrim截去右边两个字符相加再用select +rtrim拼合.
我腫了 2013-01-11
  • 打赏
  • 举报
回复
USE test
go

if(object_id('tt')>0) drop table tt
create table TT 
(
cardqty Nvarchar(40)
)
insert TT
select N'1个+2桶+3箱+4瓶+8托'
union select N'1个+2桶'
union select N'1+1'
union select N'2桶+1'
union select N'1+1桶'

--select * from tt





----- statement :

DECLARE @sql NVARCHAR(MAX)


SELECT @sql=ISNULL(@sql+' Union all ','')+'Select '+LTRIM(ROW_NUMBER()OVER(ORDER BY getdate()))+',N'''+cardqty+''',N'''+REPLACE(cardqty,'+',''' Union all Select '+LTRIM(ROW_NUMBER()OVER(ORDER BY getdate()))+',N'''+cardqty+''',N''')+'''' FROM TT
Exec (';With t(row,cardqty,cardqty2) As ('+@sql+') Select cardqty,Sum(Cast(Left(cardqty2,Patindex(''%[^0-9.]%'',cardqty2+''z'')-1) As Numeric(38,0))) As Result from t group by row,cardqty')


/*
cardqty				Result
------------------- ---------
1+1					2
1+1桶				2
1个+2桶				3
1个+2桶+3箱+4瓶+8托	18
2桶+1				3
*/
王思明 2013-01-11
  • 打赏
  • 举报
回复
非常感謝樓上幾位兄弟的鼎力幫助,跪謝了!
美到心痛 2013-01-11
  • 打赏
  • 举报
回复
引用 12 楼 maanshan1 的回复:
if(object_id('tt')>0) drop table tt create table TT ( cardqty Nvarchar(40) ) insert TT select '1个+2桶+3箱+4瓶+8托' union select '1个+2桶' union select '1+1' union select '2桶+1' union select '1+1桶……
exec是不能用在函數中,所以..

if(object_id('tt')>0) drop table tt
create table TT 
(
cardqty Nvarchar(40)
)
insert TT
select '1个+2桶+3箱+4瓶+8托'
union select '1个+2桶'
union select '1+1'
union select '2桶+1'
union select '1+1桶'

select * from TT
--建函數
create  function f_getsum(@s nvarchar(100))
returns  int
as
begin
declare  @temp table(num int)
declare @sum int

declare @sz varchar(10)
set @sz=''

declare @i int
set @i=1

while(@s<>'')
begin
if  patindex('%[0-9]%',substring(@s,@i,1))=1
	set @sz=@sz+substring(@s,@i,1)
else if(@sz<>'')
	begin
	 insert into @temp select @sz
	set @sz=''
	end
set @s=stuff(@s,@i,1,'')
end

if(@sz<>'')
 insert into @temp select @sz

select @sum=sum(num) from @temp
return @sum
end

--調用
select dbo.f_getsum(cardqty)  from TT


美到心痛 2013-01-11
  • 打赏
  • 举报
回复

--建函數
create  function f_getsum(@s nvarchar(100))
returns  int
as
begin
declare  @temp table(num int)
declare @sum int

declare @sz varchar(10)
set @sz=''

declare @i int
set @i=1

while(@s<>'')
begin
if  patindex('%[0-9]%',substring(@s,@i,1))=1
	set @sz=@sz+substring(@s,@i,1)
else if(@sz<>'')
	begin
	 insert into @temp select @sz
	set @sz=''
	end
set @s=stuff(@s,@i,1,'')
end

if(@sz<>'')
 insert into @temp select @sz

select @sum=sum(num) from @temp
return @sum
end
--測試
select dbo.f_getsum(num)  from
(
select N'1箱+1箱' as num
union all select N'1箱+1箱+1箱+1箱' as num
union all select N'1個+10個+2個' as num
) as a
--結果
2
4
13

王思明 2013-01-11
  • 打赏
  • 举报
回复
王思明 2013-01-11
  • 打赏
  • 举报
回复
引用 9 楼 yangsh0722 的回复:
SQL code?1234567891011121314declare @s varchar(50)set @s='1个+2桶+3箱+4瓶+8托' declare @i intset @i=1declare @sql varchar(100)set @sql='select 'while(@s<>'')begin if patindex('%[0-9]%',substri……
如果是只有一個,這種寫的非常好,但exec 不能輸出數值應該怎麼辦?
王思明 2013-01-11
  • 打赏
  • 举报
回复
if(object_id('tt')>0) drop table tt create table TT ( cardqty Nvarchar(40) ) insert TT select '1个+2桶+3箱+4瓶+8托' union select '1个+2桶' union select '1+1' union select '2桶+1' union select '1+1桶' select * from tt 我希望的結果是 18 3 2 3 2
zhangdoublefly 2013-01-11
  • 打赏
  • 举报
回复
嗯,学习!呵呵! 谢谢!哦!
-Tracy-McGrady- 2013-01-11
  • 打赏
  • 举报
回复

--结果
-----------
18

(1 行受影响)
-Tracy-McGrady- 2013-01-11
  • 打赏
  • 举报
回复

declare @s varchar(50)
set @s='1个+2桶+3箱+4瓶+8托' 
declare @i int
set @i=1
declare @sql varchar(100)
set @sql='select '
while(@s<>'')
begin
 if patindex('%[0-9]%',substring(@s,@i,1))=1
   set @sql=@sql+substring(@s,@i,1)+'+'
 set @s=stuff(@s,@i,1,'')
end
set @sql=left(@sql,len(@sql)-1)
exec(@sql)
yiyishuitian 2013-01-11
  • 打赏
  • 举报
回复
引用 5 楼 maanshan1 的回复:
樓上的在不?不行啊
什么不行,是函数不行.还是什么? 函数是我在自己的机器测试过的.
查理001 2013-01-11
  • 打赏
  • 举报
回复
引用 楼主 maanshan1 的回复:
1.首先结果是2 2.要求用SQL 3.‘箱’可能是个,桶等,有一个函数可以过滤 SQL
你自己都知道用函数可以解决了,还发帖问什么啊?
szm341 2013-01-11
  • 打赏
  • 举报
回复
没有写的很活

declare @s nvarchar(100)
set @s='1箱+1箱+1箱+1箱'
set @s=REPLACE(@s,right(@s,1),'')
set @s='select '+@s
exec(@s)
加载更多回复(1)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧