2016-04-06 20 views
0

Bir dizeden bazı değerleri SUM yapmaya çalışıyorum ama çalışmayı başaramıyorum. Ben SUM yorum yaparsanızSQL - SUM ile SUBSTRING

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 

Ben bu olsun: Ayrıca

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

:

enter image description here

Ama bu olsun CAST ve VPL.QTD özetlemek çalıştığınızda Bu altyazı SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME), 13 kgs

Microsoft Sql Server kullanıyorum

cevap

2

Açıkça, tamsayıya başka bir tam sayı tarafından takip edilmeyen değerlere sahipsiniz. Ben deseni değişiyor düşünüyorum rağmen,

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

Ayrıca CASE deyimi deneyebilirsiniz: Bir olasılık deseni değişiyor: SQL Server 2012+ kullanıyorsanız

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

, başka try_convert() kullanmaktır

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) 
+0

ilk CAST aynı mesajı döndürür: tüm isimler her zaman iki komşu basamak varsa daha iyi bir çözümdür. İkincisi işe yaramıyor çünkü daha eski bir versiyon kullanıyorum. Üçüncüsü, bir bitmeden önce eksik. *) Ama sonra şu mesajı alıyorum: "Değişken varchar değeri '2,' veri türü int'ye dönüştürülürken başarısız oldu." – Enato

+0

@Enato. . . İlk çalışmalı. İki rakamı bir tam sayıya dönüştürüyorsunuz ve ilk iki rakamın ilk oluşumunu bulmalısınız. –

+0

ilk seçenek iyi görünüyor, aksi halde dizede 2 basamaklı bir sayı yoksa, Dönüşüm başarısız ... mesajı ile başarısız olur. –