Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужно упростить запрос [MSSQL]


Страницы:   1 2 3

Ольга ©   (2009-07-07 11:22:00) 

В таблице есть поле 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


amir   (2009-07-09 16:37:00) [1]

Попробую пожелиться некоторым опытом. На новой (уже старой :)) работе столкнулся с древним (ЕС-м) представлением чисел в базе в символьном виде. Т.е. есть таблица, в одном из полей которой "сидят" строки по 8 символов-цифр без всяких точек. В другом поле - 6 символов-цифр и т.д. Никакой документации нетути. Последний программист, который сто-то там помнил, уволился лет 5 назад. В качестве "отправной" точки имеются только всевозможные ведомости, в которых, как правило, результаты вычислений, а не сами "числа", причем, ессно, числа дробные.
Пока не залез в асмовские исходники и не посмотрел  как там выделяется дробная часть при вычислениях (если кто помнит - десятичная упакованная арифметика), не смог разобраться.

ИМХО, это похоже на тот случай. Т.е. корректно разобраться где "валенки", а где "сапоги" без разбора программного кода невозможно.


Anatoly Podgoretsky   (2009-07-09 08:49:00) [2]


> "Там" это где? Это "кривенькое" поле мы разобрали по косточкам,
>  информация в нем однородная... Каких сюрпризов можно ждать?
>

В sql_variant = можно хранить, что угодно, даже пользовательские типы.
И для разборки надо знать формат. Поддержка ложится на пользователя, а не на сервер.


Ольга   (2009-07-08 14:52:00) [3]

Запрос в [0] и есть попытка создать курсор. "Табуретки" и "валенки" входят в состав естественного первичного ключа, которого реально в таблице нет. Вот я и хочу создать курсор, после чего N раз прогнать через него эту же таблицу, расфасовывая информацию в новую базу.


clickmaker   (2009-07-08 14:35:00) [4]

в запросе в [0] слишком много вызовов CHARINDEX.
Я бы курсором прошелся по таблице


Ольга   (2009-07-08 14:30:00) [5]


> Тогда хуже, поскольку там может быть что угодно, включая
> пользовательские типы.

"Там" это где? Это "кривенькое" поле мы разобрали по косточкам, информация в нем однородная... Каких сюрпризов можно ждать?


Anatoly Podgoretsky   (2009-07-08 14:24:00) [6]


> Так у заказчика хранятся данные (таблица создана до рождения
> Билла Гейтса): целая часть - количество "табуреток", дробная
> - количество "валенок". Делаю нормальную БД, нужно перенести
> данные.

И вряд ли это из-за низкой квалификации, судя по последним данным квалификация высокая.


Anatoly Podgoretsky   (2009-07-08 14:16:00) [7]

> Ольга  (08.07.2009 13:51:34)  [34]

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


Ольга   (2009-07-08 14:11:00) [8]


> Вариант   (08.07.09 14:09) [36]

Посыпаю голову пеплом...


Вариант   (2009-07-08 14:09:00) [9]


> Ольга ©   (08.07.09 13:51) [34]

"Просто хочется рвать и метать!" (c) Бывалов из х/ф "Волга-Волга" :-)


Anatoly Podgoretsky   (2009-07-08 13:59:00) [10]

> Ольга  (08.07.2009 13:37:33)  [33]

Для чисел, что ,5 что ,5000 это одно и тоже и нельзя различить. Существует вариант прямой, извращеной записи прямо в файл таблицы, но это врядли, вероятнее это поле не Float/Number


Ольга   (2009-07-08 13:51:00) [11]


> 956.50 - 50 валенков

Написала это пример с потолка, потом поняла, что во float .50  не записать.
Народ, каюсь - все остальные поля, коих немерено в этой таблице, float, а одно это поле sql_variant. Простите, что ввела в заблуждение.


Ольга   (2009-07-08 13:37:00) [12]

В эту таблицу пишет некий фортрановский модуль, и пишет аккуратно (видимо с округлением). Так что цифр с периодом в дробной части в ней нет.
956.5   - 5 валенков
956.50 - 50 валенков
Если встретится 0.4999 - видимо, будет 4999 валенков (но такого пока не встречалось).

> Если у заказчика есть бумажная база, то надо просто заставить
> ввести валенки вручную

Нашего Заказчика замучаешься заставлять... А вот бабок за эту работу можно неплохо срубить :)


Вариант   (2009-07-08 10:20:00) [13]


> Кщд   (08.07.09 09:42) [31]

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


Кщд   (2009-07-08 09:42:00) [14]

>Вариант   (08.07.09 09:19) [27]
какие лавры?
о чем Вы?)
>Кщд   (07.07.09 12:20) [11]


Anatoly Podgoretsky   (2009-07-08 09:34:00) [15]


> Так у заказчика хранятся данные (таблица создана до рождения
> Билла Гейтса): целая часть - количество "табуреток", дробная
> - количество "валенок". Делаю нормальную БД, нужно перенести
> данные.

Если у заказчика есть бумажная база, то надо просто заставить ввести валенки вручную


Anatoly Podgoretsky   (2009-07-08 09:33:00) [16]

Задача имеет решение только для чисел не оканчивающихся на НОЛЬ и то частичное, поскольку float имеет относительную точность и абсолютное большинство чисел можно представить только приблизительно.
Следует также добавить, что любые операции с числами меняют эту точность.


Вариант   (2009-07-08 09:23:00) [17]


> Вариант   (08.07.09 09:19) [27]


Хотя правильней - это знать ответы на вопросы

> Anatoly Podgoretsky ©   (08.07.09 09:13) [25]


> topS   (08.07.09 09:16) [26]


Вариант   (2009-07-08 09:19:00) [18]


> Кщд   (08.07.09 08:27) [23]

иии ??? Я где-то об этом упоминал?

Наверное ты хочешь сказать, что твой вариант единственно верный и нужный? С уважением к твоим знаниям и не собираясь отнять лавры первого помогшего, я просто привел свой вариант, без длинных cast. И даже не полный вариант, а только как "подумать" для автора вопроса. Ей понравился твой - я рад за тебя.


> Ольга ©   (08.07.09 09:03) [24]


> Да, здесь моя ошибка. Я не знаю сколькозначная цифра может
> встретиться после запятой

Тогда задача не решаема. Или надо передавать хотя бы количество значащих цифр параметром в запрос.


topS   (2009-07-08 09:16:00) [19]


> Ольга ©   (08.07.09 09:03) [24]

и всё же, почему вдруг -956.5это 5 валенок, а не 500?
и как 'изобразить' эти самые 500 валенок?
и почему устраивает, если 959.499999это 499999валенка, а 959.4999999это 4валенка?


Anatoly Podgoretsky   (2009-07-08 09:13:00) [20]

> Ольга  (08.07.2009 09:03:24)  [24]

Ответь на вопрос, как точно хранится 1 валенок и 10 валенок


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо