我有两个表:
具有所有产品的productID(productName,productID)的产品表
具有以下记录的交易表:日期(最近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
答案 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