J'ai une table qui montre l'input et la sortie des articles dans l'entrepôt. La camera 1 et la camera 2 documentent respectivement l'heure d'input et l'heure de sortie de cet élément. Les cameras classifient ensuite l'object à son input et quittent le checkpoint à l'aide de lasers. Par exemple: Big box: Classe 5, Medium Box: Classe 3, Small Box: Classe 2.
Parfois, la classification des cameras ne correspond pas. Par exemple: La classification à l'input peut être Moyenne et à la sortie peut être Petite boîte.
J'ai besoin de find le nombre de transactions où la class ne correspond pas pour le même TransactionDetail
, puis un pourcentage de ces discordances de class contre toute la transaction pour une certaine plage de time.
Ma table ressemble un peu à ceci:
--------------------------------------------------------------------------- | AVDetailID | TransDetailID | AVClassID | CamID | CreatedDate | --------------------------------------------------------------------------- | 20101522 | 54125478 | 5 | 1 | 2017-05-08 10:15:01:560| | 20101523 | 54125478 | 5 | 2 | 2017-05-08 10:15:01:620| | 20101524 | 54125479 | 3 | 1 | 2017-05-08 10:15:03:120| | 20101525 | 54125479 | 2 | 2 | 2017-05-08 10:15:03:860| | 20101526 | 54125480 | 4 | 1 | 2017-05-08 10:15:06:330| | 20101527 | 54125480 | 4 | 2 | 2017-05-08 10:15:06:850| ---------------------------------------------------------------------------
Ainsi, dans le cas ci-dessus, la class passe de 3 à 2 dans les loggings 3 et 4. C'est une transaction où la class a changé. J'ai besoin d'get un pourcentage de toutes les transactions où la class a changé entre chaque camera.
Le code que j'ai essayé jusqu'ici, sans succès est:
SELECT COUNT(TransDetailId) FROM [AVTransDetail] WHERE ((SELECT AVCClassId WHERE CamId = 1) <> (SELECT AVCClassId WHERE DetectionZoneId = 2)) AND CreatedDate >= '2017-04-01' AND CreatedDAte <= '2017-04-07' GROUP BY TransDetailId
Vous pouvez essayer de joindre la table sur lui-même comme ceci:
SELECT tdBefore.TransDetailId FROM AVTransDetail AS tdBefore INNER JOIN AVTransDetail AS tdAfter ON tdBefore.TransDetailID = tdAfter.TransDetailID AND tdBefore.CamID = 1 AND tdAfter.CamID = 2 WHERE tdBefore.AVClassID <> tdAfter.AVClassID AND tdBefore.CreatedDate >= '2017-04-01' AND tdAfter.CreatedDate <= '2017-04-07'
Ensuite, pour get le pourcentage:
DECLARE @MinDate DATE = '20170401', @MaxDate DATE = '20170407'; SELECT tdBefore.TransDetailId, COUNT(tdAfter.TransDetailID) OVER() AS NumDifferent, ((CONVERT(DECIMAL(3, 2), COUNT(tdAfter.TransDetailID) OVER())) / allRecords.Count) * 100 AS DiffPercent, FROM AVTransDetail AS tdBefore INNER JOIN AVTransDetail AS tdAfter ON tdBefore.TransDetailID = tdAfter.TransDetailID AND tdBefore.CamID = 1 AND tdBefore.CamID = 2 CROSS APPLY ( SELECT COUNT(*) AS [Count] FROM AVTransDetail WHERE tdBefore.CreatedDate >= @MinDate AND tdAfter.CreatedDate <= @MaxDate ) AS allRecords WHERE tdBefore.AVClassID <> tdAfter.AVClassID AND tdBefore.CreatedDate >= @MinDate AND tdAfter.CreatedDate <= @MaxDate