SQL查询不返回多个结果

时间:2014-06-24 17:08:12

标签: sql sql-server

我是SQL的新手,并尝试获取一个应该返回多天结果的SQL查询。但是它只返回所选日期之一的数据,而不是所有日期。我已经尝试删除“DISTINCT”语句,但之后它只返回多个重复结果,但所有这些都在同一天再次发生。任何suugestions将不胜感激。谢谢!

declare @Check_Date smalldatetime
set @Check_Date =  convert(varchar(8),  DATEADD( DAY , -3, CURRENT_TIMESTAMP ), 112)

SELECT
     DISTINCT [SIS].[dbo].[Stores].[StoreNbr] AS 'Store'
    ,[SIS].[dbo].[Stores].[StoreName] AS 'Name'
    ,[SIS].[dbo].[STORE_CALENDAR].[TRXN_DATE] AS 'Date'
    ,case when [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[REASON_MISSED] is null then substring([SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[REASON_MISSED],1,49) else 'Not Yet Polled' end  as 'Reason Missed'

FROM
    [SIS].[dbo].[DAILY_TOTALS], [SIS].[dbo].[Stores], [SIS].[dbo].[STORE_POLLING_EXCEPTIONS], [SIS].[dbo].[STORE_CALENDAR]

WHERE
    [SIS].[dbo].[DAILY_TOTALS].[STORE_NUMBER] = [SIS].[dbo].[Stores].[StoreNbr] 
    AND [SIS].[dbo].[DAILY_TOTALS].[TRXN_DATE] = @Check_Date
    AND [SIS].[dbo].[DAILY_TOTALS].[TRXN_DATE] = [SIS].[dbo].[STORE_CALENDAR].[TRXN_DATE]
    AND [SIS].[dbo].[DAILY_TOTALS].[NET_SALES_AMOUNT] IS NULL
    AND [SIS].[dbo].[Stores].[StoreNbr] IN (
        SELECT [SIS].[dbo].[STORE_CALENDAR].[StoreNbr]
        FROM [SIS].[dbo].[STORE_CALENDAR]
        WHERE [SIS].[dbo].[STORE_CALENDAR].[TRXN_DATE] = @Check_Date
        )
    AND [SIS].[dbo].[Stores].[StoreNbr] IN (
        SELECT [SIS].[dbo].[Stores].[StoreNbr]
        FROM [SIS].[dbo].[Stores]
        WHERE [SIS].[dbo].[Stores].[ClosingOps] IS NULL
        )
    AND [SIS].[dbo].[Stores].[StoreNbr] NOT IN (
        SELECT [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[STORE_NUMBER]
        FROM [SIS].[dbo].[STORE_POLLING_EXCEPTIONS]
        WHERE [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[TRXN_DATE] = @Check_Date
        AND [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[REASON_MISSED] IS NOT NULL
        )

UNION ALL

SELECT
     DISTINCT [SIS].[dbo].[Stores].[StoreNbr] AS 'Store'
    ,[SIS].[dbo].[Stores].[StoreName] AS 'Name'
    ,[SIS].[dbo].[STORE_CALENDAR].[TRXN_DATE] AS 'Date'
    ,[SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[REASON_MISSED] AS 'Reason Missed'

FROM
    [SIS].[dbo].[DAILY_TOTALS], [SIS].[dbo].[Stores], [SIS].[dbo].[STORE_POLLING_EXCEPTIONS], [SIS].[dbo].[STORE_CALENDAR]

WHERE
    [SIS].[dbo].[DAILY_TOTALS].[STORE_NUMBER] = [SIS].[dbo].[Stores].[StoreNbr] 
    AND [SIS].[dbo].[Stores].[StoreNbr] = [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[STORE_NUMBER]
    AND [SIS].[dbo].[DAILY_TOTALS].[TRXN_DATE] = @Check_Date  
    AND [SIS].[dbo].[DAILY_TOTALS].[TRXN_DATE] = [SIS].[dbo].[STORE_CALENDAR].[TRXN_DATE]
    AND [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[TRXN_DATE] = @Check_Date
    AND [SIS].[dbo].[DAILY_TOTALS].[NET_SALES_AMOUNT] IS NULL
    AND [SIS].[dbo].[Stores].[StoreNbr] IN (
        SELECT [SIS].[dbo].[STORE_CALENDAR].[StoreNbr]
        FROM [SIS].[dbo].[STORE_CALENDAR]
        WHERE [SIS].[dbo].[STORE_CALENDAR].[TRXN_DATE] = @Check_Date
        )
    AND [SIS].[dbo].[Stores].[StoreNbr] IN (
        SELECT [SIS].[dbo].[Stores].[StoreNbr]
        FROM [SIS].[dbo].[Stores]
        WHERE [SIS].[dbo].[Stores].[ClosingOps] IS NULL
        )

ORDER BY 'Date', 'Store'

1 个答案:

答案 0 :(得分:0)

我尝试了什么以及为了解问题而采取的行动:

  1. 别名表
  2. case为null,然后是一个子字符串(perhasp you 意思是不是空..
  3. 替换过时但仍然有效的联接 INNER / OUTER连接语法。
  4. 发现没有办法将SPE加入其他记录......假设它以某种方式存储......
  5. 找到加入可能是 限制结果......也许你真的想要外连接(所有商店 然后错过了现有的交易日期和结果...调整后的连接将返回所有商店;而不管。
  6. 发现Daily Totals的限制标准可能是问题的一部分; 也是使用外连接的原因。
  7. 假设查询仅对net_Sales_Amount为null all的结果感兴趣 其他数据将被省略。
  8. 删除了对@check_date进行store_calender检查的冗余子查询,因为我已将日期检查移至外部联接,该联接仅返回商店的记录 与该日期匹配的数字;但目前还没有消除商店 是在做。
  9. 因为现在所有的表都已正确连接(假设我们可以 找出存储轮询异常连接)不需要子查询 找出关闭操作是否为null只是使其成为一部分 标准。
  10. select中的case语句已关闭。你可以检查null,然后从空值解析一个字符串。假设需要NOT null ..
  11. 不知道如何处理第3个subselect(现在 只剩下一个)似乎你排除了所有存储了一个reason_Missed的商店,但是case语句存在....它总是为null所以要么是大错,要么是子查询是。 (所以不确定是什么行动)
  12. 停在这里..没想在第二次查询上花时间,直到第一次查询得当。
  13. 总而言之,我们需要知道

    1. 相关表格和列以及关系的表结构
    2. 每个
    3. 的示例数据
    4. 预期结果的样本(考虑使用SQL Fiddle为人们构建模板以帮助您)
    5. 纯文本所需结果的英文。我想看到所有商店错过了特定日期的交易和原因....或者什么?如果你不能说出来,那么你就不知道自己想要什么。
    6. 至于为什么你没有看到数据:

      • 条款标准限制了我不想要的结果
      • 关联表的连接条件不使用外连接,从而消除了我认为您想要的数据
      • 缺少连接正在创建一个笛卡尔产品,该产品被其他限制数据隐藏,以后可能会导致其他问题。

      SELECT
           S.[StoreNbr] AS 'Store'
          ,S.[StoreName] AS 'Name'
          ,SC.[TRXN_DATE] AS 'Date'
          ,case when SPE.[REASON_MISSED] is not null then 
             substring(SPE.[REASON_MISSED],1,49) 
             else 'Not Yet Polled' end  as 'Reason Missed'
      
      FROM [SIS].[dbo].[DAILY_TOTALS] DT 
      RIGHT JOIN [SIS].[dbo].[Stores] S
        ON  DT.[STORE_NUMBER] = S.[StoreNbr] 
      LEFT JOIN [SIS].[dbo].[STORE_CALENDAR] SC
        ON  DT.[TRXN_DATE] = SC.[TRXN_DATE]
        and DT.[TRXN_DATE] = @Check_Date
      LEFT JOIN [SIS].[dbo].[STORE_POLLING_EXCEPTIONS] SPE 
        ON S.[StoreNbr] = SPE.[Store_Number] --This likely wrong but no associations identified.
        and SC.[TRXN_DATE] = SPE.[TRXN_DATE] --Perhaps this is needed as well?
      
      
      WHERE DT.[NET_SALES_AMOUNT] IS NULL
          AND S.[ClosingOps] IS NULL
      /*  What's this do?
      
          AND S.[StoreNbr] NOT IN (
              SELECT [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[STORE_NUMBER]
              FROM [SIS].[dbo].[STORE_POLLING_EXCEPTIONS]
              WHERE [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[TRXN_DATE] = @Check_Date
              AND [SIS].[dbo].[STORE_POLLING_EXCEPTIONS].[REASON_MISSED] IS NOT NULL
              )
      

      * /     ---第一部分没有任何关于下一步的思考,其余的问题仍然存在。