2017-12-13 23 views
0

내가 MSSQL 2012를 사용하고 난 다음 데이터 형식으로 테이블 컬럼에 TRY_CONVERT와 함께 AVG를 사용하는 것을 시도하고있다 : 나는 AVG & TRY_CONVERT를 사용하여 쿼리하기 전에 nvarchar(255), NOT NULLMSSQL 2012 - 왜 AVG & TRY_CONVERT가 올바른 값을 반환하지 않습니까?

첫째, 내가 원하는 데이터입니다

SQL Results before using AVG and TRY_CONVERT AVG 및 TRY_CONVERT를 사용한 후 결과는 0 행이 반환됩니다.

Results after AVG & TRY_CONVERT

은 또한 다음 하위 쿼리를 사용하려고 내가 18 행이 반환 가지고 있지만 NULL 값으로, 나는 올바른 값을 얻는 경우 단지보기 위해 AVG에 나가 생략 ..하지만, 나는 또한 포함되지 보인다 p.serialnumber 열은 올바른 행이 반환되었음을 나타내며 TRY_CONVERT 다음에 나타나는 값은 NULL입니다.

enter image description here

UPDATE !:

I가 갖는 데이터를 대상으로하는보다 쿼리 실행에 "." 구분 기호 (qtv2.qtv_qteid = 58 (63 대신)), 작동합니다! 문제는 ","구분 기호입니다. 누구든지 이것에 대한 해결책을 알고 있습니까 ??

declare @ProjectSelection nvarchar(10) 
set @ProjectSelection = 'C82007588' 


SELECT AVG(TRY_CONVERT(numeric(10,5), avgcap)) 
FROM 
(
select qtv2.qtv_result as avgcap 
from ProductionOrder PO 
left join CustomerOrder co on co.CustomerOrderId=po.customerorderid 
left join ProductionOrderProperty pop on pop.ProductionOrderId=po.productionorderid 
left join product p on p.ProductionOrderId=po.productionorderid 
left join QualityTestValues qtv on qtv.qtv_productid=p.ProductId 
left join QualityTestValues qtv2 on qtv2.qtv_productId=p.ProductId 

where [email protected] and pop.name = 'project' and po.ProductTypeId = 1 
and qtv2.qtv_qteid = 58 and qtv2.qtv_valid = 1 and qtv.qtv_ProductSegmentId = 144 and qtv.qtv_valid = 1 
and qtv.qtv_qteid = 51 and qtv.qtv_result = 'J' 

group by co.CustomerName, pop.Value, qtv2.qtv_result, p.SerialNumber 
) A 

결과 :

(No column name) 
22.200000 
+3

시작. – jarlh

+4

대부분의 사람들은 이미지가 아닌 서식있는 텍스트를 원합니다. dbms 편집기에 이미지를 복사하여 붙여 넣을 수는 없습니다 ... – jarlh

+5

이미지를 읽을 수 없습니다. 그들을 제거하고 _text_로 최소 쿼리를 추가하십시오. –

답변

0

당신은 당신의 첫 번째 쿼리를 가지고 같은 것을 할 수 있습니다

SELECT AVG(TRY_CONVERT(numeric(10,5), avgcap)) 
FROM 
(
    -- Insert your first query here. 
) A 

이 당신에게 숫자의 평균을 제공해야합니다.

EDIT 여기

는 24.000000 반환해야 실행 가능한 예이다.

SELECT AVG(TRY_CONVERT(numeric(10,5), A)) 
FROM 
(
    SELECT '22.5' AS A 
    UNION 
    SELECT '23.5' AS A 
    UNION 
    SELECT '26.0' AS A 
) B 
+0

안녕 Danieboy, 나는 이것을 테스트하고 1 값과 NULL을 반환합니다. – Mikael

+0

내부로 게시 한 첫 번째 쿼리를 사용합니까? 모든 값을 반환 한 사람. – Danieboy

+0

@Mikael 내가 제공 한 예제를 실행 해보십시오. – Danieboy

0

호환성 수준은 어떻습니까? 비슷한 질문은 여기에서 찾을 수 있습니다 : 서버 버전 2012하지만

TRY_CONVERT fails on SQL Server 2012

, 낮은 호환성 수준이 try_convert가 데이터베이스에서 사용하기에 사용할 수없는 원인이 될 수 있습니다. 특정 데이터베이스에서 다음 코드 (예 : master 데이터베이스)를 실행하여이를 확인할 수 있습니다.

DECLARE @b VARCHAR(10) = '12312' 
SELECT TRY_CONVERT(INT,@b) 
+0

작동, 서버 2012 – Mikael

0

TRY_CONVERT 대신 TRY_PARSE를 사용하여 해결책을 발견했습니다.

DECLARE @ProjectSelection nvarchar(10) 
SET @ProjectSelection = 'C82007588' 


SELECT AVG(avgcap) as avgcap 
FROM 
(
    SELECT qtv2.qtv_result, TRY_PARSE(qtv2.qtv_result AS NUMERIC(10,3)) avgcap 
    FROM ProductionOrder PO 
     LEFT JOIN CustomerOrder co on co.CustomerOrderId=po.customerorderid 
     LEFT JOIN ProductionOrderProperty pop on pop.ProductionOrderId=po.productionorderid 
     LEFT JOIN product p on p.ProductionOrderId=po.productionorderid 
     LEFT JOIN QualityTestValues qtv on qtv.qtv_productid=p.ProductId 
     LEFT JOIN QualityTestValues qtv2 on qtv2.qtv_productId=p.ProductId 
    WHERE [email protected] 
     AND pop.name = 'project' 
     AND po.ProductTypeId = 1 
     AND qtv2.qtv_qteid = 63 
     AND qtv2.qtv_valid = 1 
     AND qtv.qtv_ProductSegmentId = 144 
     AND qtv.qtv_valid = 1 
     AND qtv.qtv_qteid = 51 
     AND qtv.qtv_result = 'J' 
    GROUP BY co.CustomerName, pop.Value, qtv2.qtv_result, p.SerialNumber 
) A` 

결과 : avgcap https://stackoverflow.com/help/mcve와 21264.850000