Выбрать сгенерированными значениями и подзапросами - PullRequest
0 голосов
/ 08 марта 2019

У меня есть продукт db со следующими таблицами:

  • Продукты *
  • Сертификаты *
  • Отчеты *
  • Описание *
  • Products_Certificates *
  • Certificates_Reports
  • Certificates_Descriptions

Существует множество отношений между продуктами и сертификатами, сертификатами и отчетами, а также сертификатами и описаниями.

В каждой таблице, отмеченной *, есть столбец с отметкой времени (может быть нулевым).

Желаемый выход

Все столбцы таблицы продуктов + новый столбец с

  • 0, если временная метка строки равна нулю
  • 1, если метка времени строки не равна нулю, но метка времени любого из связанных объектов (или их связанных сущностей) равна нулю
  • 2, если метка времени строки не равна нулю и метка времени всех связанных сущностей (или их связанных сущностей) не равна нулю

У меня даже нет ни малейшего представления, как это решить.


Этот запрос показывает, как все таблицы объединяются:

   SELECT Products.*
     FROM Products
LEFT JOIN Products_Certificates
       ON Products_Certificates.ProductNumber = Products.ProductNumber
LEFT JOIN Certificates
       ON Certificates.ID = Products_Certificates.CertificateID
LEFT JOIN Certificates_Reports
       ON Certificates_Reports.CertificateID = Certificates.ID
LEFT JOIN Reports
       ON Reports.ID = Certificates_Reports.ReportID
LEFT JOIN Certificates_Descriptions
       ON Certificates_Descriptions.CertificateID = Certificates.ID
LEFT JOIN Descriptions
       ON Descriptions.ID = Certificates_Descriptions.DescriptionID

1 Ответ

0 голосов
/ 08 марта 2019

Используя макетированные данные и написанные на 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:
подробно enter image description here


Резюме
enter image description here


повернута
enter image description here


А вот и окончательные результаты:
enter image description here

Потребуется дополнительная работа, чтобы сделать остальные 4 таблицы активными в detail CTE. Приведенный выше код дает вам представление о том, как решить проблему, изложенную в исходном посте. Кроме того, тщательно протестируйте оператор case - может потребоваться добавить другие критерии, если вы запустите его для текущих данных, если значения 1 и 2 назначены неправильно.

...