【问题标题】:SQL - find missing records in each dateSQL - 查找每个日期的缺失记录
【发布时间】:2019-05-23 05:57:25
【问题描述】:

我有两张桌子:

  1. 包含所有产品的 productID(productName、productID)的产品表

  2. 包含以下列的交易记录表:日期(过去 3 个月)和产品 ID。所有 productID 都应至少有每个日期的一条记录。

但是,某些 dats 缺少 productID 记录,我想查找缺少的 productID 以及它们缺少的相应日期。

目前,我只能找到一个特定日期的缺失记录,即:

Select productName, productID
from product a inner join transaction b
On a.productid=b.productid
Where a.productid not in 
    (
    Select distinct productid
    From transaction
    Where date='2019-03-01'
    )

我想要一个表格来合并所有日期及其各自缺失的 productid 记录。我该如何从这里开始?

    create table product
    (ProductID INT,
    ProductName Char (30)
     );

    insert into product values 
    (1, 'apple'), 
    (2, 'orange'), 
    (3, 'pear'); 

    create table transaction1 
    (transDate Date, 
    productID INT, 
    revenue FLOAT); 

    insert into transaction1 values 
    ('2019-03-01', 1, 2.5), 
    ('2019-03-01', 2, 4.0), 
    ('2019-03-01', 2, 8.0), 
    ('2019-03-01', 3, 6.0), 
    ('2019-03-02', 1, 7.0), 
    ('2019-03-02', 3, 14.0), 
    ('2019-03-03', 1, 1.5) ;

我所拥有的将与此类似,其中 productID=2 从 03-02 中丢失。我工作的日期从年初到昨天,都记录在事务表中。 @SimonPrice

【问题讨论】:

  • 您能否转到 SQLFIddle 并重新创建问题,以便我们为您提供帮助。它只需要是一个最小的示例,但是,在每个表中提供 20 条记录,以便我们知道您在使用什么。您是否希望在某个日期范围或特定日期或多个日期或范围内执行此操作?
  • 提示:使用全外连接并在 productid 中查找 NULL。
  • 您使用的是哪个数据库?
  • @mkRabbani 抱歉,您能详细说明一下这个问题吗?我正在使用的数据库包含多个表,而我正在使用的两个表只是该数据库的一小部分。我正在使用 Microsoft SQL Server 2012
  • 得到你的答案 "microsoft SQL server 2012" :) 你应该在你的问题中标记这个数据库,这有助于其他人。

标签: sql sql-server-2012


【解决方案1】:

您的问题中最棘手的部分是为您的预期日期生成所有日期的列表,在您的情况下为 90 天。在这里,我使用循环创建了所有日期。在 Product 和 Temp 表中添加了一个附加列“Common”,值为 1,以便与所有日期和所有产品的产品表连接。

注意:只需根据您要检查的天数更改@HowManyDay 的值即可。

DECLARE @HowManyDay INT
SET @HowManyDay = 8
DECLARE @LoopCount INT
SET @LoopCount = 0 


DECLARE @TempTable TABLE(Common INT,All_Date DATE)

WHILE @LoopCount <=  @HowManyDay-1
BEGIN
    INSERT INTO @TempTable (Common,All_Date)
    VALUES (1,DATEADD(DD,-@LoopCount,GETDATE()))

    SET @LoopCount = @LoopCount + 1
END

SELECT  B.All_Date,C.productID,C.productName,T.date
FROM @TempTable B
INNER JOIN
(
    SELECT 1 [Common],* 
    FROM product
)C ON B.Common = C.Common
LEFT JOIN transaction_details T ON C.productID = T.productID AND B.All_Date = T.date
WHERE T.date IS NULL
ORDER BY 3 ASC,1 DESC

【讨论】:

  • 非常感谢!这是我问题的答案:)
  • @Tan 你很受欢迎。你也可以给我一个赞成票:)
  • 已投票,但不幸的是我的声望不到 15,因此不会显示,抱歉。再次感谢!
  • 没关系,亲爱的 :)
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多