SQL - найти пропущенные записи в каждой дате - PullRequest
1 голос
/ 23 мая 2019

У меня есть две таблицы:

  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'
    )

Я хотел бы иметь таблицу, которая объединяет все даты и соответствующие им отсутствующие записи о продуктах. Как я могу продолжить отсюда?

    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

1 Ответ

0 голосов
/ 23 мая 2019

Самая сложная часть вашей проблемы - создать список всех дат для ожидаемой даты, которая в вашем случае составляет 90 дней.Здесь я создал все даты, используя цикл.В таблицу Product и Temp добавлен один дополнительный столбец «Common» со значением 1, чтобы объединить его с таблицей product для всей даты и всего продукта.

Примечание: Просто измените значение @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
...