我的结果如下:
Code Declaration
123 a1 - 2nos
123 a2 - 230nos
123 a3 - 5nos
123 a1 - 100nos
123 a3 - 6nos
是否可以对重复项求和,我需要输出显示如下:
Code Declaration
123 a1 - 102nos
123 a2 - 230nos
123 a3 - 11nos
答案 0 :(得分:4)
我的答案基于您发布的previous question。这是一个CTE版本,它将分割数据并将它们归为声明:
;with cte (code, DeclarationItem, Declaration) as
(
select Code,
cast(left(Declaration, charindex(',',Declaration+',')-1) as varchar(50)) DeclarationItem,
stuff(Declaration, 1, charindex(',',Declaration+','), '') Declaration
from yourtable
union all
select code,
cast(left(Declaration, charindex(',',Declaration+',')-1) as varchar(50)) DeclarationItem,
stuff(Declaration, 1, charindex(',',Declaration+','), '') Declaration
from cte
where Declaration > ''
),
s2 as
(
select code,
ltrim(rtrim(left(declarationitem, charindex('-', declarationitem)-1))) col1
, reverse(left(reverse(declarationitem), charindex('-', reverse(declarationitem))-1)) col2
from cte
),
fnl as
(
select code, col1,
left(col2, patindex('%[Aa-Zz]%', col2)-1) value,
substring(col2, patindex('%[Aa-Zz]%', col2), len(col2)) str
from s2
)
select code, col1 +' - '+ cast(sum(cast(value as int)) as varchar(50)) + str as declarationitem
from fnl
group by code, col1, str
结果是:
| CODE | DECLARATIONITEM |
--------------------------
| 123 | 123 a1 - 102nos |
| 123 | 123 a2 - 230nos |
| 123 | 123 a3 - 11nos |
答案 1 :(得分:2)
Declare @t Table([Code] int, [Declaration] varchar(max))
Insert Into @t VALUES (123,'a1 - 2nos'),(123,'a2 - 230nos'),(123,'a3 - 5nos'),(123,'a1 - 100nos'),(123,'a3 - 6nos')
;With Cte As(
Select
Code
,Substring([Declaration],0,PatIndex('%-%',[Declaration])) Part1
,Cast(Substring(LTRIM(RTRIM(Substring([Declaration],PatIndex('%-%',[Declaration])+1,Len([Declaration])))),0,PatIndex('%nos%',LTRIM(RTRIM(Substring([Declaration],PatIndex('%-%',[Declaration])+1,Len([Declaration])))))) As Int) Part2
From @t)
Select Code,Part1 + '-' + Cast(Sum(Part2) AS Varchar(10)) + 'nos' As Declaration
From Cte
Group By Code,Part1
答案 2 :(得分:1)
SELECT Code, SUBSTRING(Declaration, 0, CHARINDEX('-', Declaration) + 2) +
CAST(SUM(SUBSTRING(Declaration,
CHARINDEX('-', Declaration) + 2,
PATINDEX('%[Aa-Zz]%', SUBSTRING(Declaration,
CHARINDEX('-', Declaration) + 2,
LEN(Declaration)
)
) - 1
) + 0) AS varchar(max)) +
REVERSE(SUBSTRING(REVERSE(Declaration), 0, PATINDEX('%[0-9]%', REVERSE(Declaration)))) AS Decalration
FROM your_table
GROUP BY Code,
SUBSTRING(Declaration, 0, CHARINDEX('-', Declaration) + 2),
REVERSE(SUBSTRING(REVERSE(Declaration), 0, PATINDEX('%[0-9]%', REVERSE(Declaration))))
SQLFiddle上的演示