左连接语句返回具有数据的行/列的意外的空值

问题描述:

我有两个表,我正在写一个查询。某些列可以在其中一个表中找到,而某些列可以被计算出来。左连接语句返回具有数据的行/列的意外的空值

为了清楚起见,我会复制我的查询如下:

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。不知道你为什么要铸造浮动。你应该使用数字来代替浮点数。发布此查询不会执行,因为并非所有的列都在组中或聚合。 –

@ 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到年组合这样的结果是有点古怪,但它仍然有效。