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

时间:2016-08-17 14:58:11

标签: sql sql-server database join

我有两个表,我正在编写查询。有些列可以在其中一个表中找到,而有些列则是calucalted。

为清楚起见,我将复制下面的查询:

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

我的表格看起来像这样

表a:

|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

我遇到的问题是'总花费列中的一些值'获得赋值null。总支出是按年计算的,此字段永远不应为空。同样,year列在任一表中都不包含空值。但由于某些原因,当我运行查询时,我得到的结果是year列中的某些行具有空值。这绝不应该发生。大多数结果符合我的预期,但也有一些不符合。

我猜这与field_b中的某些行为空并转换为0的事实有关,但为什么这很重要?

我更新了表格和查询,以更准确地反映数据库的结构。

是查询运行,我没有命名冲突。

1 个答案:

答案 0 :(得分: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到Yr组合,因此结果有点时髦但它仍然有效。