Дублированный идентификатор SQL Server в таблице JOIN генерирует неверную сумму (случаи) - PullRequest
0 голосов
/ 13 июня 2019

У меня есть следующий запрос, который дает мне неправильную сумму. Это дублирует сумму Случаев, когда объединяются Таблица Runlog с Table Palletitem. Я пробовал несколько разных запросов, также пытался получить сумму в подзапросе, но я не могу избавиться от этого дубликата. мой текущий запрос настолько хорош, насколько мог бы получить. Спасибо за помощь

Ожидаемый результат


RunID   Cases    LotNumber
1749    416.00   B703, B705

Текущий результат с текущим кодом


RunID   Cases    LotNumber
1749    520.00   B703, B705

Текущий код

SELECT distinct RunLog.RunID,
  Sum(RunLog.casecount) AS Cases,
    stuff((SELECT DISTINCT ', ' + cast(lot.lotnumber AS varchar(20))
                           FROM         PalletItem t2 inner JOIN
                                              Lot ON Lot.ID = t2.Lotid
                                             AND t2.RunID = RunLog.RunID
                           WHERE      
                            t2.datepalletized>='2019-06-10 16:52:00'
                             and t2.datepalletized<='2019-06-10 20:00:00'
                             group by lot.lotnumber
                            FOR XML PATH('')), 1, 1, '') AS [LotNumber]

FROM RunLog
   INNER JOIN Lot on Lot.runid=RunLog.runid
   INNER JOIN PalletItem ON PalletItem.LotNumber = Lot.ID 
   AND palletitem.palletid=runlog.palletid 
   WHERE RunLog.ActionDate>='2019-06-10 16:52:00'
   AND RunLog.ActionDate<='2019-06-10 19:02:00'
GROUP BY RunLog.RunID

ОБРАЗЕЦ ДАННЫХ НИЖЕ

Таблицы


PalletItem
                     --------------
PalletID    Lotid       DatePalletized       RunID
2004109     14657       2019-06-10 16:53:00  1749      
2004110     14657       2019-06-10 17:47:00  1749      
2004110     14659       2019-06-10 17:47:00  1749      
2004111     14659       2019-06-10 17:48:00  1749      
2004112     14659       2019-06-10 19:01:00  1749    
                      ---------------


Runlog
                     ---------------
RunID   PalletID    casecount   ActionDate
1749    2004109     104.00      2019-06-10 16:52:52.000
1749    2004110     104.00      2019-06-10 17:46:58.000
1749    2004111     104.00      2019-06-10 17:47:36.000
1749    2004112     104.00      2019-06-10 19:00:38.000
                     -----------------

Lot 
     ------
ID      LotNumber   runid
14657   B703        1749
14659   B705        1749
    --------

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Ваши два INNER JOIN вводят соединение «многие ко многим». Вот почему у вас есть дубликаты. Более того, вы не используете столбцы из этих таблиц в вашем select. Вам не нужно distinct, на столе уже group by.

SELECT RunLog.RunID,
  Sum(RunLog.casecount) AS Cases,
    stuff((SELECT DISTINCT ', ' + cast(lot.lotnumber AS varchar(20))
                           FROM         PalletItem t2 inner JOIN
                                              Lot ON Lot.ID = t2.Lotid
                                             AND t2.RunID = RunLog.RunID
                           WHERE      
                            t2.datepalletized>='2019-06-10 16:52:00'
                             and t2.datepalletized<='2019-06-10 20:00:00'
                             group by lot.lotnumber
                            FOR XML PATH('')), 1, 1, '') AS [LotNumber]

FROM RunLog
   --INNER JOIN Lot on Lot.runid=RunLog.runid
   --INNER JOIN PalletItem ON PalletItem.Lotid = Lot.ID 
   --AND palletitem.palletid=runlog.palletid 
   WHERE RunLog.ActionDate>='2019-06-10 16:52:00'
   AND RunLog.ActionDate<='2019-06-10 19:02:00'
GROUP BY RunLog.RunID
0 голосов
/ 13 июня 2019

Выполнить:

SELECT Sum(RunLog.casecount) AS Cases, count(*) rows
FROM RunLog
--   INNER JOIN Lot on Lot.runid=RunLog.runid
--   INNER JOIN PalletItem ON PalletItem.LotNumber = Lot.ID 
--   AND palletitem.palletid=runlog.palletid 
   WHERE RunLog.ActionDate>='2019-06-10 16:52:00'
   AND RunLog.ActionDate<='2019-06-10 19:02:00'
--GROUP BY RunLog.RunID

, затем

SELECT Sum(RunLog.casecount) AS Cases, count(*) rows
FROM RunLog
     INNER JOIN Lot on Lot.runid=RunLog.runid
--   INNER JOIN PalletItem ON PalletItem.LotNumber = Lot.ID 
--   AND palletitem.palletid=runlog.palletid 
   WHERE RunLog.ActionDate>='2019-06-10 16:52:00'
   AND RunLog.ActionDate<='2019-06-10 19:02:00'
--GROUP BY RunLog.RunID

, затем

SELECT Sum(RunLog.casecount) AS Cases, count(*) rows
FROM RunLog
     INNER JOIN Lot on Lot.runid=RunLog.runid
     INNER JOIN PalletItem ON PalletItem.LotNumber = Lot.ID 
     AND palletitem.palletid=runlog.palletid 
   WHERE RunLog.ActionDate>='2019-06-10 16:52:00'
   AND RunLog.ActionDate<='2019-06-10 19:02:00'
--GROUP BY RunLog.RunID

Чтобы увидеть, как объединения вводят дубликаты в результат, перед вами Sumзначения casecount.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...