在SQL中添加匹配字符串的数字部分

时间:2014-09-10 10:37:25

标签: sql sql-server

这很难解释,所以我将尝试演示,这都是在MS SQL存储过程中完成的。

我有一份记录列表

  • 10 foos
  • 15 foos
  • 35 bahs
  • 98 foobahs
  • 10 foos
  • 35 foos
  • 35 bahs
  • 99 foobahs
  • 99 foobahs
  • 杰夫
  • 布赖恩
  • 杰夫
  • James 99
  • James 99
  • 詹姆斯

我有一个脚本,目前将记录转换为:

  

2x 10 foos + 15 foos + 3x 35 bahs + 98 foobahs + 2x 99foobahs + 2x Geoff + Brain + 2x James 99 + James

我需要的是在字符串的开头添加所有类似的记录,其中theree是一个数值,导致

  

35 foos + 105 foos + 296 foobahs + 2x Geoff + Brain + 2x James 99 + James

2 个答案:

答案 0 :(得分:0)

  1. 在处理初始项目符号列表
  2. 之前,创建一个table variable名称数量
  3. 在处理项目符号列表期间,将每个具有规范化名称的项目(foo,bah,brian,geoff,...)作为单独的记录添加到表变量中
  4. 您的结果为SELECT Name, SUM(Quantity) FROM @tableVar GROUP BY Name
  5. 从上面的结果构建请求的字符串
  6. 随时询问是否有任何不清楚的事情

答案 1 :(得分:0)

分割数字和项目并将它们作为单独的列存储在表格中会更好。 SQL服务器中的字符串操作不好。话虽如此,您可以尝试以下查询

此查询将值拆分为数字和项目,然后汇总相似项目并将它们连接到单个值。非常难看,但希望它有效

;WITH items
AS
(
       SELECT CAST(
                CASE WHEN PATINDEX('%[^0-9]%',columnName)>1 
                    THEN SUBSTRING(columnName,1,PATINDEX('%[^0-9]%',columnName))
                ELSE '1' END 
                AS INT) 
            AS Number,
                CASE WHEN PATINDEX('%[^0-9]%',columnName)>1 
                    THEN SUBSTRING(columnName,PATINDEX('%[^0-9]%',columnName),LEN(columnName))
                ELSE columnName END
            AS Item  
       FROM theTable  

)
SELECT CAST(SUM(Number) AS VARCHAR(10)) + ' ' + item  + ' +' AS 'text()'
FROM items
GROUP BY item
FOR XML Path('')