SQL查询在应该有数值的连接后返回空值

Posted

技术标签:

【中文标题】SQL查询在应该有数值的连接后返回空值【英文标题】:SQL query is returning null values after join where there should be numeric values 【发布时间】:2021-12-27 02:08:30 【问题描述】:

我正在将现有表中的一些数据插入到新表中。有一个名为 DescNitro 的特定列在新表中返回为 0 或 Null。我已经检查了特定情况,并且 Null 值正在替换旧表上的数值。知道为什么会这样吗?代码如下:

DECLARE @DataAtual date = '2021-11-01'; 
DECLARE @UltMes date = DATEADD(MONTH, -1, @DataAtual);
DECLARE @PenUltMes date = DATEADD(MONTH, -2, @DataAtual);
DECLARE @AnoUltMes integer = YEAR(@UltMes);
DECLARE @MesUltMes integer = MONTH(@UltMes);
DECLARE @AnoPenUltMes integer = YEAR(@PenUltMes);
DECLARE @MesPenUltMes integer = MONTH(@PenUltMes);

SELECT
    m.datAno
    ,m.datMes
    ,m.Segmento
    ,m.nomDiretoria
    ,m.nomFilial
    ,m.Ov
    ,o.[Região] AS Filial_Pri
    ,m.[Cod_Rede] AS Cod_Rede
    ,m.Desc_Rede
    ,m.CodSegTatica AS cod_Canal_SAP
    ,m.Canal_Pricing AS cod_Canal_Pri
    ,m.Des_Canal_Pricing
    ,m.codMaterial
    ,m.Vol_Meta AS Vol_Meta_Ciex
    ,m.Fat_Meta AS Fat_Meta_Ciex
    ,g.[DescNitro]
INTO
    [pri].[tblMetaPrecoteste]
FROM
    [pri].[tblDadMetaCiex] m
LEFT JOIN
    dbo.tblCadMaterial mat ON mat.codMaterial = m.codMaterial
LEFT JOIN
    [pri].[tblDadOvFilial] o ON o.[Organização] = m.Ov
LEFT JOIN 
    [pri].[tblDadArvore] a ON a.Material = m.codMaterial
                           AND a.[Filial] = o.[Região]
                           AND a.[Canal de Vendas] = m.[Des_Canal_Pricing]
LEFT JOIN
    (SELECT
         t.[codMaterial], 
         t.[codOrganizacaoVenda], 
         t.[codSegTatica], 
         t.[codRede], 
         SUM(t.[DescNitro]) AS DescNitro
     FROM
         [MktIntelligence].[dbo].[tbl_F_PM_join_real_fifo_meta_com_gp] t
     WHERE
         (t.datmes = @MesUltMes AND t.datAno = @AnoUltMes) 
         OR (t.datmes =  @MesPenUltMes AND t.datAno =  @AnoPenUltMes)  
     GROUP BY
         t.[codMaterial], t.[codOrganizacaoVenda], t.[codSegTatica], t.[codRede]) g ON m.[codMaterial] = g.[codMaterial]
               AND m.[Ov] = g.[codOrganizacaoVenda]
               AND m.[codSegTatica] = g.[codSegTatica]
               AND m.[Cod_Rede]  = g.[codRede]

【问题讨论】:

因为这是一个left join,因此如果没有匹配,它将显示为NULL,否则显示为isnull(columnname,0),因此当它为NULL时将显示0 过去 2 个月的 tbl_F_PM_join_real_fifo_meta_com_gp 中可能缺少数据?没有匹配,没有 g.DescNitro。 是的,刚刚在其中一个表的 CodRede 列中发现了一个问题。它具有“1”值,而其他表中的相应列是“01”。因此,在这些情况下没有匹配项,这正是 DescNitro 最初具有不同于零的值的地方。非常感谢大家,我自己不会想出来的! 【参考方案1】:

因为这是一个left join,因此如果没有匹配,它将显示为NULL,否则使用isnull(columnname,0),因此当它为NULL时将显示0

【讨论】:

以上是关于SQL查询在应该有数值的连接后返回空值的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询返回空值

sql 查询时有空值返回0怎么写

sql 子查询返回的值不止一个怎么解决?

SQL 查询数据连接具有它忽略的空值

SQL中空值查询''与null 的区别

为啥针对 S3 的 pyspark sql 查询返回空值