Используя макетированные данные и написанные на SQL Server 2014, вот код, с которого можно начать -
declare @Products table
(
ProductNumber int not null,
Created date
);
insert into @Products values
(1, '1/7/2019'),
(2, null),
(3, '3/4/2019'),
(4, '3/7/2019');
declare @Products_Certificates table
(
CertificateID int not null,
ProductNumber int not null,
Created date
);
insert into @Products_Certificates values
(50, 1, null),
(51, 1, '2/2/2019'),
(52, 3, '2/2/2019'),
(53, 4, null),
(54, 4, null);
declare @Certificates table
(
ID int not null,
Created date
);
insert into @Certificates values
(50, null),
(51, '3/1/2019'),
(52, null);
with
detail as
(
SELECT
p.ProductNumber,
p.Created,
pc.CertificateID,
c.ID,
Products_Certs_Date_Flag = iif(pc.Created is null, 0, 1),
Certificates_Date_Flag = iif(c.Created is null, 0, 1)
FROM @Products p
LEFT OUTER JOIN @Products_Certificates pc ON pc.ProductNumber = p.ProductNumber
LEFT OUTER JOIN @Certificates c ON c.ID = pc.CertificateID
/*
LEFT OUTER JOIN @Certificates_Reports cr ON cr.CertificateID = c.ID --no timestamp in this table
LEFT OUTER JOIN @Reports r ON r.ID = cr.ReportID
LEFT OUTER JOIN @Certificates_Descriptions cd ON cd.CertificateID = c.ID --no timestamp in this table
LEFT OUTER JOIN @Descriptions d ON d.ID = cd.DescriptionID;
*/
),
summary as
(
select
ProductNumber,
Created,
DateStatus = iif(Products_Certs_Date_Flag + Certificates_Date_Flag > 0, 'date exists', 'no date')
from detail
),
pivoted as
(
select
ProductNumber,
Created,
[date exists],
[no date]
from summary
pivot (count(DateStatus) for DateStatus in ([date exists], [no date])) p
)
select
ProductNumber,
Created,
Outcome =
case
when Created is null then 0
when [no date] > 0 then 1
else 2
end
from pivoted
order by
ProductNumber;
Вот снимки экрана промежуточных наборов результатов в CTE:
подробно
Резюме
повернута
А вот и окончательные результаты:
Потребуется дополнительная работа, чтобы сделать остальные 4 таблицы активными в detail
CTE. Приведенный выше код дает вам представление о том, как решить проблему, изложенную в исходном посте. Кроме того, тщательно протестируйте оператор case
- может потребоваться добавить другие критерии, если вы запустите его для текущих данных, если значения 1 и 2 назначены неправильно.