Sql 左join语句返回包含数据的行/列的意外空值

Sql 左join语句返回包含数据的行/列的意外空值,sql,sql-server,database,join,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),

我有两个表,我正在对它们编写查询。某些列可以在其中一个表中找到,而某些列是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
我遇到的问题是,“总花费列”中的一些值被分配为空值。每年计算总支出,此字段不应为空。同样,year列在两个表中都不包含null值。但由于某种原因,当我运行查询时,我得到的结果中,year列中的某些行的值为null。这永远不应该发生。大多数结果符合我的预期,但也有一些不符合

我猜这与字段_b中的某些行为null并被转换为0这一事实有关,但这又有什么关系呢

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


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

@SeanLange的评论很可能是您预期结果的问题所在。也就是说,
NULL
不等于
NULL
NULL-NULL
Null
是sql中的一个“
unknown
”值,两个未知数不相等

但是,如果您希望将它们作为同一个案例进行匹配,则可以消除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的组合,因此结果有点奇怪,但仍然有效。

该查询真的执行了吗?@jarlh查询执行时,我只是得到了我不期望的结果。当您为NULL时,连接将不会返回匹配的行,因为NULL为NULL。不知道你为什么要投花车。您可能应该使用数字来代替,因为浮点数是近似值。由于并非所有列都在group by或group by中,因此无法执行此查询。1。您应该为表使用别名,因为例如,您的分组包含不明确的列名。2.您希望字段c和字段e的值是多少?因为你根本没有按它们分组。我可以期望MySQL执行那个查询,但是SQL Server???(常规GROUP BY规则说:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。”)