MSSQL中的子查询生成NULL值

时间:2016-07-22 10:44:00

标签: sql sql-server

我正在尝试确定我的商店仅从数据库中获得帐户收入,为此,我需要查看所有帐号以及“'商店”的收入。说明谁没有出现在' online'的帐户列表中我在下面的子查询中尝试过的描述。查询运行但它只在我的store_only_revenue列中返回NULL值。任何有关如何从这里做的指导将不胜感激。我是否以一种好的方式解决问题?或者是否有更好的解决方案:

 SELECT 
    town,
    financial_pd as month,
    SUM(CASE WHEN [Descr] = 'online' THEN Net_Revenue ELSE 0 END) as online_revenue,
    SUM(CASE WHEN [Descr] = 'store' THEN Net_Revenue ELSE 0 END) as store_revenue,

    COUNT(DISTINCT CASE WHEN [Descr] = 'online' THEN Account_Number ELSE NULL END) as online_accounts,
    COUNT(DISTINCT CASE WHEN [Descr] = 'store' THEN Account_Number ELSE NULL END) as store_accounts,


    (SELECT 
    SUM(Net_Revenue)

      FROM [mydb].[dbo].[mytable]

      WHERE 

      Descr = 'store'
      AND Account_Number

      NOT IN(
      SELECT DISTINCT Account_Number
      FROM [mydb].[dbo].[mytable]
      WHERE 
      Descr = 'online')

      ) as store_only_revenue

     FROM [mydb].[dbo].[mytable] as orders


     WHERE 

      Group_name = 'T' 
      AND NOT 
      Type_name_1 = 'Electronic' 
      AND 
      Account_type <> 1                 
      AND
      Total_Value > 0
      AND
      (Insert_Date BETWEEN '2016-05-30' AND '2016-07-03'
      OR
      Insert_Date BETWEEN '2015-05-25' AND '2015-06-28')
      OR
      (Insert_Date BETWEEN '2016-05-30' AND '2016-07-03'
      AND
      Insert_Date BETWEEN '2015-05-25' AND '2015-06-28')


      GROUP BY 
      town,
      financial_pd as period

1 个答案:

答案 0 :(得分:1)

这个表达是可疑的:

Account_Number NOT IN (SELECT DISTINCT t.Account_Number
                       FROM [mydb].[dbo].mytable t
                       WHERE t.Descr = 'online'
                      ) 

假设语法问题是拼写错误(缺少表名,desc是保留字),那么即使一个Account_NumberNULL,这也永远不会返回true。解决此问题的一种方法是:

Account_Number NOT IN (SELECT t.Account_Number
                       FROM [mydb].[dbo].mytable t
                       WHERE t.Desc = 'online' AND t.Account_Number IS NOT NULL
                      ) 

我会使用NOT EXISTS

not exists (select 1
            from [mydb].[dbo].??? x
            where x.Desc = 'online' AND ??.Account_Number = x.Account_Number
           ) 

您需要使用适当的表别名才能生效。这些解决方案都可以解决您的问题。

相关问题