Проблема MYSQL с ОТЛИЧНОЙ СУММОЙ - PullRequest
0 голосов
/ 01 ноября 2011

У нас есть «генератор отчетов», который в основном строит серию запросов MySQL на основе опций, выбранных пользователем. Данные из серии запросов используются для построения графика. Мы натолкнулись на отчет, который возвращает неправильные значения на основе SUM. Вот запрос (я не уверен, что на этом сайте есть форматирование кода, поэтому я просто вставлю его):

SELECT DISTINCT SUM( pp.EffectivePrice)
FROM quotes qu
LEFT JOIN plans pl ON pl.ID = qu.planID AND qu.active_quote = '1'
LEFT JOIN plan_procedures pp ON pp.QuoteID = qu.ID AND qu.active_quote = '1'
LEFT JOIN patients pt ON pt.ID = pl.patientID
LEFT JOIN events_log el7881 ON el7881.TreatmentID = pl.ID
LEFT JOIN events_log el9205 ON el9205.TreatmentID = pl.ID
WHERE  el7881.LogDate >= '2011-01-01 00:00:00'  AND ( (el7881.CurrStageID != '5'  AND pt.ID != '')  AND  (el7881.CurrStageID != '19'  AND pt.ID != '') ) AND  (((CAST(pl.surgery_date AS DATE)  BETWEEN '2011-01-01' AND '2011-01-31' AND pl.surgery_date != '') OR (pl.LastSurgeryDate != '0000-00-00 00:00:00' AND CAST(pl.LastSurgeryDate AS DATE)  BETWEEN '2011-01-01 00:00:00' AND '2011-01-31 23:59:59'))  AND pt.ID != '')  AND  el9205.LogDate <= '2011-01-31 23:59:59'  AND ( (el9205.CurrStageID = '4' AND el9205.PrevStageID != '4'  AND pt.ID != '') ) AND  qu.active_quote = '1'  AND ( pl.doctorID = '6'  OR  pl.doctorID = '9'  OR  pl.doctorID = '13' )

Запрос автоматически генерируется php-скриптом, поэтому он запутанный. Но вопрос здесь прост: почему, когда я запускаю этот запрос, результирующее значение отличается от того, когда я выполняю тот же запрос без 'SUM ()' и просто вручную добавляю значения? Когда я добавляю их вручную, результат корректен, но результат с SUM () выше, чем должен быть. Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

SELECT DISTINCT возвращает только уникальные строки. Ваш запрос, даже если он сильно задействован, возвращает только одну строку с одним полем при использовании версии SUM ().

Когда вы делаете SELECT DISTINCT pp.EffectivePrice, вы удаляете все строки, которые имеют одинаковое значение EffectivePrice.

так, учитывая некоторые поддельные возвращаемые данные

   $1.00
   $2.00
   $1.00
   $3.00

DISTINCT будет скрывать дубликат результата в $ 1,00, и ваша сумма будет $ 1 + $ 2 + $ 3 = $ 6, что теперь мало на 1 $ от фактической суммы.

0 голосов
/ 01 ноября 2011

Когда вы выбираете с помощью DISTINCT, вы получаете различные значения. Любые двойники удаляются. Итак, если ваш запрос без DISTINCT вернет: 1, 3, 4, 4, 5, 3, 6

тогда использование DISTINCT вернет 1, 3, 4, 5, 6.

Вы использовали DISTINCT вне SUM, поэтому все числа, включая двойные, суммируются, и затем вы получаете значения DISTINCT результата, который уже является одним числом. Другими словами, DISTINCT ничего не делает в вашем запросе.

Теперь, если вы сделаете: SELECT SUM(DISTINCT pp.EffectivePrice), тогда вы сложите все отдельные цены.

Но на самом деле, это может быть и неправильно. Вы уверены, что не хотите сумму? Я думаю, что вы вообще не должны использовать DISTINCT.

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