Конференция "Базы" » Нужно упростить запрос [MSSQL]
 
  • Ольга © (07.07.09 11:22) [0]
    В таблице есть поле float. В запросе это поле нужно представить в виде двух натуральных чисел - целая и дробная части без округлений.
    Делаю с помощью строковых функций - получилась громоздкая конструкция. Уверена, что можно сделать проще, не могу найти как.

    IF object_id('tempdb..#tmp') is not null DROP TABLE #tmp
    CREATE TABLE #tmp(val2 float)
    INSERT INTO #tmp VALUES (-956.5)

    SELECT  ABS(cast(CASE WHEN CHARINDEX('.',cast(val2 as varchar(20)))>0
     THEN substring(cast(val2 as varchar(20)),1,CHARINDEX('.',cast(val2 as varchar(20)))-1)
     ELSE NULL END as int)),
        cast(CASE WHEN CHARINDEX('.',cast(val2 as varchar(20)))>0
     THEN substring(cast(val2 as varchar(20)),CHARINDEX('.',cast(val2 as varchar(20)))+1,2)
     ELSE NULL END as int)
    FROM #tmp
  • Ega23 © (07.07.09 11:26) [1]
    Я бы в numeric сначала попробовал скастовать, а дальше уже с ним игрался бы.
  • MsGuns © (07.07.09 11:43) [2]
    А зачем понадобилась дробная часть плавающего числа как целое БЕЗ ОКРУГЛЕНИЯ ?
  • Ольга © (07.07.09 11:54) [3]

    > А зачем понадобилась дробная часть плавающего числа как
    > целое БЕЗ ОКРУГЛЕНИЯ

    Так у заказчика хранятся данные (таблица создана до рождения Билла Гейтса): целая часть - количество "табуреток", дробная - количество "валенок". Делаю нормальную БД, нужно перенести данные.
  • Кщд (07.07.09 11:54) [4]
    >Ольга ©   (07.07.09 11:22)  
    floor, round, ceiling не работают?
  • Ольга © (07.07.09 11:59) [5]

    > floor, round, ceiling не работают?

    Эти функции округляют: 956.5 -> 957  5
  • Anatoly Podgoretsky © (07.07.09 12:13) [6]
    > Ольга  (07.07.2009 11:54:03)  [3]

    Вероятнее всего получишь 0.33333 валенка
  • Anatoly Podgoretsky © (07.07.09 12:15) [7]
    > Ольга  (07.07.2009 11:59:05)  [5]

    Зато 956.5 - Int(Num) не округляют
  • Anatoly Podgoretsky © (07.07.09 12:16) [8]
    > Ольга  (07.07.2009 11:54:03)  [3]

    Я вообще много чудес видел, но данный заказчик всех переплюнул.
  • Кщд (07.07.09 12:16) [9]
    >Ольга ©   (07.07.09 11:59) [5]
    ну, а если подумать, то нечто вроде:
    round(x - 0.5)
  • Ega23 © (07.07.09 12:17) [10]

    > ну, а если подумать, то нечто вроде:
    > round(x - 0.5)


    Не факт.
  • Кщд (07.07.09 12:20) [11]
    >Ega23 ©   (07.07.09 12:17) [10]
    тогда строго из BOL:
    SELECT ROUND(150.75, 0, 1);
    GO
  • Ольга © (07.07.09 12:26) [12]
    Попробовала с numeric - стало еще хуже, в дробной части незначимые нули.

    > SELECT ROUND(150.75, 0, 1);

    А вот это вроде то, что надо (до последней строчки мануала не дочитала)
  • Ольга © (07.07.09 12:53) [13]
    И так, табуретки теперь преобразовываются просто. А с "валенками" не получается:

    IF object_id('tempdb..#tmp') is not null DROP TABLE #tmp
    CREATE TABLE #tmp(val2 float)
    INSERT INTO #tmp VALUES (-956.5)
    INSERT INTO #tmp VALUES (959.49)

    SELECT ABS(cast(ROUND(val2,0,1) as int)),
          cast(CASE WHEN CHARINDEX('.',cast(val2 as varchar(20)))>0
      THEN substring(cast(val2 as varchar(20)),CHARINDEX('.',cast(val2 as varchar(20)))+1,2)
      ELSE NULL END as int)
    FROM #tmp  ELSE NULL END as int)


    Есть еще идеи? Это мне нужно не из любви к искусству, количество "валенок" нужно несколько раз использовать в предлжении WHERE
  • ANB (07.07.09 13:04) [14]

    > количество "валенок" нужно несколько раз использовать в
    > предлжении WHERE

    сделай вложенный запрос и не парься.
  • Кщд (07.07.09 13:48) [15]
    >Ольга ©   (07.07.09 12:53) [13]
    >CHARINDEX('.'
    в MS SQL разделитель не зависит от локали?)

    если абстрактно, то:
    целая часть: ABS(cast(ROUND(val2,0,1) as int))
    => дробная: frac = abs(val2) - ABS(cast(ROUND(val2,0,1) as int))
    => искомое int2 = cast(frac * power(10, len(cast(frac as varchar(20)))-2) as int)
  • Вариант (07.07.09 14:11) [16]

    > Ольга ©   (07.07.09 12:53) [13]


    Поиграй с запросом

    DECLARE @N  float;
    SET @N=-750.158;

    select ROUND(@N,0,1) as C,ROUND(@N-ROUND(@N,0,1),3) as FR


    А если и дробную часть надо как целую, то почему бы ее не умножить... на 10 или 100 или 1000  или сколько знаков дробной там надо учесть прямо в запросе?
  • topS (07.07.09 14:36) [17]
    > Ольга ©   (07.07.09 11:54) [3]
    > ...целая часть - количество "табуреток", дробная - количество "валенок".

    0.1 это сколько валенок, 1 или 10? а может быть 1000000?
  • Кщд (07.07.09 14:53) [18]
    >topS   (07.07.09 14:36) [17]

    >дробная - количество "валенок".
  • topS (07.07.09 15:02) [19]

    > Кщд   (07.07.09 14:53) [18]

    кому нужны ошметки валенок?
 
Конференция "Базы" » Нужно упростить запрос [MSSQL]
Есть новые Нет новых   [134473   +31][b:0][p:0.001]