2014-12-11 2 views
0

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

SELECT 
(
    (
    SELECT SUM(ID) 
    FROM TABLE 
    where ID in 
    (
     select top 1 ID 
     from TABLE with (NOLOCK) 
     where ID > 0 
    ) 
) - 
    (
    SELECT SUM(ID) 
    FROM TABLE 
    where ID in 
    (
     select top 1 ID 
     from TABLE with (NOLOCK) 
     where ID < 0 
     order by ID desc 
    ) 
)  
) As IDs_Remaining 

Как мне взять IDs_Remaining и поделитесь результатами другого запроса?

+0

Вы знаете, что действительно делает NOLOCK? Вы отсутствуете и/или дублируете строки в своем запросе? –

ответ

1

Сначала измените разницу запрос, как это.

SELECT (SELECT TOP 1 ID 
     FROM TABLE 
     WHERE ID > 0 order by ID) - (SELECT TOP 1 ID 
          FROM TABLE 
          WHERE ID < 0 
          ORDER BY ID DESC) 

то для разделения по другому запросу используйте это.

SELECT (SELECT TOP 1 ID 
     FROM TABLE 
     WHERE ID > 0 order by ID) - (SELECT TOP 1 ID 
          FROM TABLE 
          WHERE ID < 0 
          ORDER BY ID DESC) /--divider select query as Result 
+0

Спасибо, что отлично поработали. Я пытался объявить переменные и использовать UNION, я был далеко от тропы. Сэкономил мне много времени. –

1

Просто разделите с любым другим запросом вам необходимо:

SELECT 
    (
     (SELECT ...) - (SELECT ...) 
    )/
    (SELECT ...) As FinalResult 

Обратите внимание, что если ID является целым числом, ваше подразделение также будет целочисленное деление (без фракции). Таким образом, вам может понадобиться отличить знаменатель от типа данных с плавающей точкой, прежде чем делить, сделав что-то вроде CAST((SELECT ...) AS real)

Кстати, выбрав ТОП-1 запись из таблицы, не гарантирует, что вы получите тот, стоимость. Поэтому не забудьте добавить ORDER BY ID или ORDER BY ID ASC также, когда вам нужно самое низкое значение (это верно, даже если идентификатор является основным ключом - заказ никогда не гарантируется, если вы явно не введите ORDER BY).

Кроме того, нет смысла брать SUM столбца идентификатора, если в столбце ID содержатся только отдельные значения. В этом случае, вы могли бы просто заменить первую часть вашего запроса с:

SELECT (
    (SELECT MIN(ID) FROM TABLE WHERE ID > 0) - 
    (SELECT MAX(ID) FROM TABLE WHERE ID < 0) 
) as IDs_Remaining 

Или, в качестве альтернативы, для сканирования таблицы только один раз:

SELECT 
    MIN(CASE WHEN ID > 0 THEN ID ELSE NULL END) - 
    MAX(CASE WHEN ID < 0 THEN ID ELSE NULL END) as IDs_Remaining 
FROM TABLE