SQL - 带SUBSTRING的SUM

时间:2016-04-06 11:14:59

标签: sql sql-server sum

我试图从一个字符串中提取一些值,但我似乎无法使它工作。

SELECT 
    P.NOME
    ,ISNULL(SUM(VPL.QTD),0) as TQTD
    ,CAST(LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)),2) AS INT)  
    ,SUM(CAST(LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)),2) AS INT)) * ISNULL(SUM(VPL.QTD),0)
FROM Tabela1 as P
GROUP BY P.NOME

如果我评论SUM,我得到这个:

enter image description here

但是当我尝试将CAST和VPL.QTD相加时,我得到了这个:

"Conversion failed when converting the varchar value 'Ga' to data type int."

此外,此子字符串SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)会返回13 kgs

我正在使用Microsoft Sql Server

1 个答案:

答案 0 :(得分:2)

显然,您有一个值,其中整数后面没有另一个整数。一种可能性是改变模式:

SUM(CONVERT(INT,
            LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9][0-9]%', P.NOME), LEN(P.NOME)), 2) 
               )
   ) * ISNULL(SUM(VPL.QTD),0)

如果您使用的是SQL Server 2012+,则另一种方法是使用try_convert()

SUM(TRY_CONVERT(INT,
                LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)), 2) 
               )
   ) * ISNULL(SUM(VPL.QTD),0)

您也可以尝试CASE语句,但我认为如果所有名称总是有两个相邻数字,则更改模式是更好的解决方案:

SUM(CASE WHEN P.NOME LIKE '%[0-9][0-9]%'
         THEN CONVERT(INT,
                      LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9][0-9]%', P.NOME), LEN(P.NOME)), 2) 
                     )
    END
   ) * ISNULL(SUM(VPL.QTD),0)