2017-12-13 3 views
0

Ich verwende MSSQL 2012 und ich versuche AVG zusammen mit dem folgenden Datentyp mit TRY_CONVERT auf einer Tabellenspalte zu verwenden: nvarchar(255), NOT NULLMSSQL 2012 - Warum gibt AVG & TRY_CONVERT nicht den richtigen Wert zurück?

Zuerst, bevor ich versuche & TRY_CONVERT mit AVG abzufragen, ist dies die Daten, die ich will Abrufen der AVG-Wert aus der Verwendung dieser Abfrage:

SQL Results before using AVG and TRY_CONVERT Und das ist die Ergebnisse nach der Verwendung von AVG und TRY_CONVERT, 0 Zeilen zurückgegeben.

Results after AVG & TRY_CONVERT Ich habe auch versucht, bekam ich eine Unterabfrage zu verwenden, dann 18 Zeile zurückgegeben, aber mit dem Wert NULL, übersprungen ich nur auf AVG zu sehen, ob ich die richtigen Werte erhalten wurde .. aber es scheint nicht, ich gehörte auch In der Spalte "p.serialnumber" wird angezeigt, dass die richtigen Zeilen zurückgegeben wurden. Es ist nur der Wert NULL, der nach TRY_CONVERT angezeigt wird.

enter image description here

UPDATE !:

Wenn ich die Abfrage ausführen, unter dem Daten Ziel, das hat ein "" separator (qtv2.qtv_qteid = 58 (statt 63)), es funktioniert! Das Problem ist also das Trennzeichen ",". Wer kennt die Lösung?

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 

Ergebnis:

(No column name) 
22.200000 
+3

beginnen mit https://stackoverflow.com/help/mcve. – jarlh

+4

Die meisten Leute wollen hier formatierten Text, keine Bilder. (Sie können Bilder nicht kopieren und in Ihren dbms Editor einfügen ...) – jarlh

+5

Ich kann Ihre Bilder nicht lesen. Entfernen Sie sie und fügen Sie eine minimale Abfrage als _text_ hinzu. –

Antwort

0

Sie können Ihre erste Abfrage und etwas tun, wie diese nehmen:

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

Dies sollte man den Mittelwert der Zahlen geben.

EDIT

Hier ist ein praktikables Beispiel, das 24,000000 zurückkehren.

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

Hi Danieboy, ich habe das getestet und es gibt 1 Wert zurück und es ist NULL. – Mikael

+0

Verwenden Sie die erste Abfrage, die Sie als intern gepostet haben? Derjenige, der alle Werte zurückgegeben hat. – Danieboy

+0

@Mikael versuchen, das von mir bereitgestellte Beispiel auszuführen. – Danieboy

0

Wie ist Ihr Kompatibilitätspegel? Eine ähnliche Frage ist hier zu finden:

TRY_CONVERT fails on SQL Server 2012

Obwohl die Server-Version 2012, ein niedrigerer Kompatibilitätsgrad ist die try_convert verursachen kann für die Verwendung in Ihrer Datenbank nicht verfügbar. Sie können dies überprüfen, indem Sie den folgenden Code in Ihrer spezifischen Datenbank ausführen und anschließend zum Beispiel die Master-Datenbank.

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

es funktioniert, Server ist 2012 – Mikael

0

Ich fand die Lösung mit TRY_PARSE anstelle von TRY_CONVERT.

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` 

Ergebnisse: avgcap 21264,850000

Verwandte Themen