Как выбрать разницу с помощью sql? - PullRequest
0 голосов
/ 11 марта 2011

Я написал SQL-запрос для получения данных следующим образом:

SELECT (MAX (b.filledqty) - MAX (a.filledqty)) AS filledtoday   
FROM clientordermas a, 
     clientordermas b  
WHERE a.clordid = 'w9110126'    
  AND b.clordid = 'w9110126'    
  AND (SELECT max(a.price) 
       FROM clientordermas a 
       WHERE a.clordid = 'w9110126') < 1000;

В таблице есть три записи для данного clordid со значениями цены 800, 900 1200.

Итак, мне нужно получить разницу между 1200 и 900, которая равна 300.

Но приведенное выше утверждение всегда возвращает 0. То, что я должен получить, это MAX (b.filledqty) retuns 1200 и MAX (a.filledqty) retuns 900.

Но этого не происходит.Это не та проблема, с которой я сталкиваюсь, а упрощенная версия.

Может кто-нибудь помочь?

Ответы [ 5 ]

3 голосов
/ 11 марта 2011

Предполагая, что 1000 является магическим значением, которое действительно должно быть жестко закодировано:

SELECT MAX(filledqty) - MAX(CASE WHEN price < 1000 THEN filledqty ELSE NULL END)
  FROM clientordermas
  WHERE clordid='w9110126';

Возможно, вы захотите заменить ELSE NULL на ELSE 0, в зависимости от того, какой результат вы хотите получить, если значения меньшечем 1000.

Редактировать Понял, что я частично неправильно прочитал вопрос, поэтому вторая часть моего ответа не имеет значения.Изменено выше, чтобы ссылаться price, где это необходимо.

0 голосов
/ 11 марта 2011

Один из способов сделать это ( Выберите разницу между Top 2 DISTINCT fillqties ):

SELECT ( ( SELECT max(c.filledqty) 
             FROM clientordermas c 
             WHERE c.clordid = 'w9110126'
         )
         - MAX (a.filledqty)
       ) AS filledtoday   
  FROM clientordermas a 
  WHERE a.clordid = 'w9110126'    
    AND a.filledqty <
        ( SELECT max(b.filledqty) 
            FROM clientordermas b 
            WHERE b.filledqty= 'w9110126'
        )
;

Но Дейв Коста дал вам метод, который лучше работает в Oracle.

0 голосов
/ 11 марта 2011

Какое бизнес-правило выполняет условие для max () <1000?Вы ищете максимальное значение выше 1000 минус максимальное значение ниже 1000? </p>

Если это так, то:

select a.price - b.price
from (select clorid, max(price) as price from  clientordermas a WHERE a.clordid = 'w9110126' and price > 1000) a,
join (select clorid, max(price) as price from  clientordermas a WHERE a.clordid = 'w9110126' and price < 1000) b
on a.clorid = b.clorid;

, хотя вам необходимо расширить бизнес-правила, которые я думаю обработатьслучай, когда значение clorid не превышает 1000 или значение меньше 1000.

0 голосов
/ 11 марта 2011

Я думаю, что вы неправильно поняли свои концепции SQL.

На самом деле получилось, что вы получили таблицу перекрестного соединения строк 3x3 = 9 с дублированными полями.

Ваше последнее предложение where является фиксированным результатом. Так что это означает, что MAX(b.filledqty) - MAX(a.filledqty) оперируется в этой таблице из 9 строк. Конечно, оба максимальных значения одинаковы (то есть 1200). Результат равен нулю.

Если вы хотите найти разницу между максимальным значением и минимальным значением, попробуйте что-то вроде этого:

SELECT TOP 1 (b.filledqty - a.filledqty) AS filledtoday
FROM clientordermas a INNER JOIN clientordermas b ON (a.clordid=b.clordid)
WHERE a.clordid = '...'
ORDER BY a.filledqty, b.filledqty DESC

Этот запрос сначала выполняет внутреннее самостоятельное соединение, которое дублирует необходимый столбец, затем сортирует один столбец по возрастанию, а другой - по убыванию. Первая результирующая комбинация будет иметь максимальное и минимальное значения.

Если вы хотите найти разницу между максимальным значением и значением от второго до максимального, попробуйте следующее:

SELECT TOP 1 (b.filledqty - a.filledqty) AS filledtoday
FROM clientordermas a INNER JOIN clientordermas b ON (a.clordid=b.clordid)
WHERE a.filledqty <> b.filledqty    (*this filters out max-max combo*)
WHERE a.clordid = '...'
ORDER BY a.filledqty DESC, b.filledqty DESC

Верхняя строка в результирующем наборе содержит значение max и second-to-max - значение second-to-max принимается за верхнее значение, которое не совпадает с max-значением.

Если вы хотите найти разницу между максимальным значением и верхним значением <1000, попробуйте следующее: </p>

SELECT TOP 1 (b.filledqty - a.filledqty) AS filledtoday
FROM clientordermas a INNER JOIN clientordermas b ON (a.clordid=b.clordid)
WHERE a.filledqty <> b.filledqty AND b.filledqty < 1000
WHERE a.clordid = '...'
ORDER BY a.filledqty DESC, b.filledqty DESC
0 голосов
/ 11 марта 2011

Я предполагаю, что у вас одинаковые записи в a и b.Таким образом, результат 1200 - 1200 равен 0.

SELECT (MAX (b.filledqty) - MAX (a.filledqty)) AS filledtoday   
FROM clientordermas a, 
     clientordermas b  
WHERE a.clordid = 'w9110126'    
  AND b.clordid = 'w9110126'    
  AND a.price < 1000;

Имеет ли это какое-то значение для вас?

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