SQL-查找每个日期中缺少的记录

时间:2019-05-23 05:57:26

标签: sql sql-server-2012

我有两个表:

  1. 具有所有产品的productID(productName,productID)的产品表

  2. 具有以下记录的交易表:日期(最近3个月)和productID。每个日期的所有productID至少应有一个记录。

但是,有些数据缺少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) ;

我所拥有的将与此类似,其中03-02缺少productID = 2。我正在处理从年初到昨天的所有日期,这些日期都记录在交易表中。 @SimonPrice

1 个答案:

答案 0 :(得分:0)

问题中最棘手的部分是为您的期望日期生成90天的所有日期列表。在这里,我使用循环创建了所有日期。在“产品和温度”表中又增加了一个值为“ 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