2016-08-17 71 views
-1

我有兩個表,我正在寫一個查詢。某些列可以在其中一個表中找到,而某些列可以被計算出來。左連接語句返回具有數據的行/列的意外的空值

爲了清楚起見,我會複製我的查詢如下:

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 

我有這個樣子

表一表:

|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 

表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 

這個問題, m的含義是「總支出列」中的某些值被分配了空值。總支出每年計算一次,並且此字段不應爲空。同樣,年份列在任何一個表中都不包含空值。但由於某種原因,當我運行查詢時,我得到的結果中有一些年份列中的某些行的值爲空值。這絕不應該發生。大部分的結果都符合我的預期,但也有一些不符合我的預期。

我猜這與field_b中的某些行爲空並轉換爲0這一事實有關,但爲什麼這很重要?

我更新了表和查詢以更準確地反映數據庫的結構。

是的查詢運行,我沒有命名衝突。

+0

該查詢是否真的執行? – jarlh

+0

@jarlh查詢執行,我只是得到我沒有料到的結果。 –

+0

那麼,當你有NULL連接將不會返回匹配的行,因爲NULL <> NULL。不知道你爲什麼要鑄造浮動。你應該使用數字來代替浮點數。發佈此查詢不會執行,因爲並非所有的列都在組中或聚合。 –

回答

1

@ SeanLange的評論是最可能與您的預期結果相關的問題。那就是NULL不等於NULLNULL <> NULL)。 Null是sql中的「unknown」值,2個未知數是不相等的。

但是,如果您想將它們作爲相同的大小寫匹配,則可以消除NULL。只需使用COALESCE()ISNULL(),並在ON條件的兩側提供相同的默認值,並確保您的默認值未在數據集中表示,否則會得到不希望的結果。

您提供我們
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 

你的具體的例子的數據集重複FIELDA到年組合這樣的結果是有點古怪,但它仍然有效。