2013-09-18 3 views
0

Ниже приведен запрос, который я пытаюсь запустить.MYSQL- Имея с возвращением пустой результат

SELECT p_date,TS.substationid,ts.substationcode,ts.manufacturingproductid,ts.assemblylineid,ts.teamid,ts.subofficecode, 
TA.AllowID,ta.allowname,ta.minbenchmark,ta.maxbenchmark,COUNT(vfp.UnitsPass) Achieved, 
      CASE TA.RewardType 
        WHEN 'Monthly' THEN 
          TA.RewardValue/DAY(LAST_DAY(P_Date)) 
       WHEN 'Yearly' THEN 
          TA.RewardValue/((STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM P_Date),1,1),'%Y%m%d')) /(STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM P_Date),12,31), '%Y%m%d'))) 
       WHEN 'Daily' THEN 
          (TA.RewardValue*12)/365   
       END-- , 0) 
       AS Allowance 
FROM tempsubstation ts 
LEFT JOIN TempAllowances ta ON ts.manufacturingproductid=ta.manufacturingproductid AND ts.subofficecode=ta.subofficecode 
LEFT JOIN wms_vfproduction vfp ON DATE(vfp.CreationDate)=p_date AND vfp.StationCode='1600150' 
WHERE ta.AllowID=41 AND vfp.UnitsPass=1 
GROUP BY p_date,substationcode 
HAVING COUNT(vfp.UnitsPass) BETWEEN ta.minbenchmark AND ta.maxbenchmark 

Добавление имея с между начинается возвращение пустой results.while, когда я сравнивал его с твердыми закодированных значений возвращает результаты (опять же, без между ними). чтобы он был обобщен, я не могу использовать жестко закодированные значения, и он не работает, даже если я даю ему жестко закодированные значения.

UPDATE: Не работает между ними, потому что он уже выбирает набор результатов с диапазоном, где max меньше результата COUNT(). Однако всегда существует по крайней мере один диапазон с максимальным значением, превышающим результат COUNT().

+0

Вы пытались использовать условие «МЕЖДУ» в предложении «ГДЕ».? – Jhanvi

+1

агрегированная функция не будет работать в условии where, поэтому необходимость иметь предложение – Salik

+1

попробует вот так: 'HAVING COUNT (vfp.UnitsPass) BETWEEN MIN (ta.minbenchmark) И MAX (ta.maxbenchmark)' – Stephan

ответ

0

то, что я делал неправильно, не группировало результат, заданный ta.minbenchmark и ta.maxbenchmark. следовательно, он получал бы только результаты для первой пары min-max, которую он технически усматривал, делая положение предложения неэффективным. Таким образом, правильный запрос будет следующим: (для тех, кто совершает ту же ошибку):

SELECT p_date,TS.substationid,ts.substationcode,ts.manufacturingproductid,ts.assemblylineid,ts.teamid,ts.subofficecode, 
TA.AllowID,ta.allowname,ta.minbenchmark,ta.maxbenchmark,COUNT(vfp.UnitsPass) Achieved, 
      CASE TA.RewardType 
        WHEN 'Monthly' THEN 
          TA.RewardValue/DAY(LAST_DAY(P_Date)) 
       WHEN 'Yearly' THEN 
          TA.RewardValue/((STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM P_Date),1,1),'%Y%m%d')) /(STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM P_Date),12,31), '%Y%m%d'))) 
       WHEN 'Daily' THEN 
          (TA.RewardValue*12)/365   
       END-- , 0) 
       AS Allowance 
FROM tempsubstation ts 
LEFT JOIN TempAllowances ta ON ts.manufacturingproductid=ta.manufacturingproductid AND ts.subofficecode=ta.subofficecode 
LEFT JOIN wms_vfproduction vfp ON DATE(vfp.CreationDate)=p_date AND vfp.StationCode='1600150' 
WHERE ta.AllowID=41 AND vfp.UnitsPass=1 
GROUP BY p_date,substationcode,ta.minbenchmark,ta.maxbenchmark 
    HAVING COUNT(vfp.UnitsPass) BETWEEN ta.minbenchmark AND ta.maxbenchmark 

;