2016-08-17 1 views
-1

Ich habe zwei Tabellen, für die ich eine Abfrage schreibe. Einige der Spalten können in einer der Tabellen gefunden werden, während einige der Spalten calucalted sind.Linke Join-Anweisung, die unerwartete Nullwerte für Zeilen/Spalten mit Daten zurückgibt

Aus Gründen der Klarheit werde ich meine Abfrage kopieren unter:

select field_a, 
     cast(field_b as int), 
     field_c, 
     field_d, 
     Year, 
     coalesce(cast(field_e as float),0) America_spend, 
     sum(cast(field_e as float), 0) as America_spend, 
     coalesce(cast(field_e as float)/ sum(cast(field_e as float)) over(partition by Year) as total_spend 
from table_a 
left join table_b on 
    table_a.flield_a = table_b.field_a1 and 
    table_a.flield_b = table_b.field_b1 and 
    table_a.Year = table_b.Year 
group by field_a, 
     field_b, 
     Year 

I Tabellen haben, die wie folgt aussehen

Tabelle ein:

|field_a|field_b|field_c|field_d|Year|field_f|field_g|field_h 
|data | 1 | data | data |2014| data | data | data 
|data | 1 | data | data |2014| null | data | data 
|0  | 1 | data | data |2014| data | data | data 
|data | 1 | data | data |2014| null | data | data 
|0  | 1 | data | data |2014| data | data | data 

Tabelle b:

|field_a1|field_b1|Year|field_c1|field_j 
|null | 1 |2014| data | data 
|data | 1 |2015| data | data 
|null | 0 |2014| data | data 
|data | 1 |2015| data | data 
|null | 0 |2014| data | data 

Das Problem, das ich ' m ist, dass einige der Werte in der Spalte "Gesamtausgaben" einen Wert von null erhalten. Die Gesamtausgaben werden pro Jahr berechnet und dieses Feld sollte niemals null sein. Ebenso enthält die Spalte "Jahr" in keiner der Tabellen einen Nullwert. Aber aus irgendeinem Grund, wenn ich die Abfrage ausführen, erhalte ich Ergebnisse, die einige der Zeilen in der Spalte Jahr mit einem Nullwert enthalten. Dies sollte niemals passieren. Die meisten Ergebnisse entsprechen dem, was ich erwarten würde, aber einige nicht.

Ich vermute, das hat etwas damit zu tun, dass einige der Zeilen in field_b null sind und auf 0 konvertiert werden, aber warum ist das wichtig?

Ich aktualisierte die Tabellen und die Abfragen, um die Struktur der Datenbank genauer widerzuspiegeln.

Ja, die Abfrage läuft und ich habe keine Namenskonflikte.

+0

Wird diese Abfrage wirklich ausgeführt? – jarlh

+0

@jarlh Die Abfrage wird ausgeführt, ich erhalte nur Ergebnisse, die ich nicht erwartet habe. –

+0

Wenn Sie NULL haben, gibt der Join keine übereinstimmende Zeile zurück, da NULL <> NULL ist. Ich bin mir nicht sicher, warum du auf Floats wirfst. Sie sollten wahrscheinlich stattdessen einen numerischen Wert verwenden, da Floats ungefähr sind. Wie gebucht, würde diese Abfrage nicht ausgeführt, da nicht alle Spalten in der Gruppe enthalten oder aggregiert sind. –

Antwort

1

@ SeanLange Kommentar ist wahrscheinlich das Problem mit Ihren erwarteten Ergebnissen. Das heißt, dass NULL NICHT gleich NULL (NULL <> NULL) ist. Null ist ein "unknown" Wert in SQL und 2 Unbekannten sind nicht gleich.

Aber Sie können Ihre NULL beseitigen, wenn Sie sie als den gleichen Fall zusammenpassen möchten. Verwenden Sie einfach COALESCE() oder ISNULL() und stellen Sie auf beiden Seiten Ihrer ON-Bedingung den gleichen Standardwert bereit und stellen Sie sicher, dass Ihr Standard nicht in Ihrem Dataset dargestellt wird oder Sie unerwünschte Ergebnisse erhalten.

DECLARE @TableA AS TABLE (FieldA VARCHAR(5),FiledB INT,Yr INT) 
DECLARE @TableB AS TABLE (FieldA VARCHAR(5),FiledC INT,Yr INT) 

INSERT INTO @TableA (FieldA,FiledB,Yr) 
VALUES (null,1,2014),('data',1,2015),(null,1,2014),('data',1,2015),(null,1,2014) 
INSERT INTO @TableB (FieldA,FiledC,Yr) 
VALUES (null,1,2014),('data',1,2015),(null,1,2014),('data',1,2015),(null,1,2014) 

SELECT * 
FROM 
    @TableA a 
    LEFT JOIN @TableB b 
    ON COALESCE(a.FieldA,'NULLVALUE') = COALESCE(b.FieldA,'NULLVALUE') 
    AND a.Yr = b.Yr 

Ihr besonderes Beispiel Datenmenge, die Sie uns zur Verfügung gestellten wiederholt FieldA zu Yr Kombinationen, so dass die Ergebnisse etwas abgefahren sind, aber es funktioniert immer noch.

Verwandte Themen