2015-05-06 3 views
1

У меня есть таблица с числовым столбцом, которая содержит как положительные, так и отрицательные числа. Как найти запись с номером det, самым близким к нулю?Как вернуть значение, самое близкое к нулю

Этот запрос

SELECT MIN(ABS(dNumber)) 
FROM myTable 

возвращает опр наименьшее абсолютное значение. Однако я хочу, чтобы возвращаемое значение было подтверждено.

Так что если myTable содержит 2 записи; один с dNumber = 2000, второй с dNumber = -1000, я хочу, чтобы запрос возвращался -1000, а не 1000.

EDIT: Забыл упомянуть, что это должно быть в совокупности funtion как его часть запроса с GROUP BY

SELECT Key1, Key2, 
    SUM(CASE WHEN /*condition1*/ THEN dNumber ELSE NULL END) AS 'Value1', 
    SUM(CASE WHEN /*condition2*/ THEN dNumber ELSE NULL END) AS 'Value2', 
    MIN(ABS(dNumber)...) AS 'ClosestToZeroAndSigned' 
FROM myTable 
/*joins*/ 
WHERE /*conditions*/ 
GROUP BY Key1, Key2 
+0

оригинальное сообщение отредактировано – hightow

+0

Я заметил ваш EDIT и улучшил свой ответ – ASh

ответ

4

I. автономный запрос

SELECT top 1 dNumber 
FROM myTable 
order by ABS(dNumber) 

II. часть более крупного запроса с группой по

;with cte as 
(
    SELECT Key1, Key2, 
    SUM(CASE WHEN /*condition1*/ THEN dNumber ELSE NULL END) AS 'Value1', 
    SUM(CASE WHEN /*condition2*/ THEN dNumber ELSE NULL END) AS 'Value2', 
    -- max negative value 
    max(case when dNumber <= 0 then dNumber else null end) as Negative, 
    -- min positive value 
    min(case when dNumber > 0 then dNumber else null end) as Positive 
    FROM myTable 
    /*joins*/ 
    WHERE /*conditions*/ 
    GROUP BY Key1, Key2 
) 
select 
    Key1, Key2, Value1, Value2 
    Negative, Positive, 
    case when (abs(Negative) < Positive or Positive is null) then Negative else Positive end as 'ClosestToZeroAndSigned' 
from cte 
Смежные вопросы