Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

26 Сентябрь 2020, 01:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: MIN/MAX символьного поля  (Прочитано 9435 раз)
0 Пользователей и 1 Гость смотрят эту тему.
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Стартовое сообщение: 31 Октябрь 2013, 10:26 »

Есть такая таблица (см. скрин)
Пытаюсь запросом выбрать минимум и максимум по полю SCHET

SELECT MIN( "SCHET" ) AS "С", MAX( "SCHET" ) AS "ПО", "GR1" FROM "СПРАВОЧНИК СЧЕТОВ" GROUP BY "GR1" HAVING ( ( "GR1" IS NOT NULL ) )

минимум   - 811.10.10
максимум - 811.6.6

это из-за того, что поле SCHET символьное.

Как преобразовать в числовое, чтобы выборка делалась правильно?


[вложение удалено Администратором]
Записан

Яна (in real)
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #1: 31 Октябрь 2013, 14:08 »

Нужно преобразовать их к одному шаблону ХХХ.ХХ.ХХ я так понимаю  Непонимающий
Записан

Яна (in real)
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #2: 31 Октябрь 2013, 14:21 »

...или разделить на три числовых столбца - счет-субсчет-субсубсчет

Как насчет создать представление приблизительно с таким текстом
Код:
SELECT "СПРАВОЧНИК СЧЕТОВ".*,
  ( CAST( LEFT( "SCHET", LOCATE( '.', "SCHET" ) - 1 ) AS INTEGER ) * 1000
    + CAST( SUBSTR( "SCHET", LOCATE( '.', "SCHET" ) + 1, LOCATE( '.', "SCHET", LOCATE( '.', "SCHET" ) + 1 )
    - ( LOCATE( '.', "SCHET" ) + 1 ) ) AS INTEGER ) ) * 1000 + CAST( RIGHT( "SCHET", LENGTH( "SCHET" )
    - LOCATE( '.', "SCHET", LOCATE( '.', "SCHET" ) + 1 ) ) AS INTEGER ) AS "DIGIT_SCHET"
FROM "СПРАВОЧНИК СЧЕТОВ"
и уже из него дергать данные, ориентируясь на значение в DIGIT_SCHET?
« Последнее редактирование: 31 Октябрь 2013, 16:57 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #3: 1 Ноябрь 2013, 10:02 »

Как насчет создать представление приблизительно с таким текстом....

Я пошла более длинным путем, отталкиваясь от длины счета и прибавляя "0" в определенных местах после точки. Ваш вариант намного компактнее. Можно вопрос?

AS INTEGER - это преобразование найденного текста в число  Да уж...?

Не то я не нашла как это сделать. Только с ним SQL "ругается" -  requires FROM in statement
Записан

Яна (in real)
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 1 Ноябрь 2013, 10:13 »

Я пошла более длинным путем, отталкиваясь от длины счета и прибавляя "0" в определенных местах после точки.
Ваш вариант намного компактнее.
Увы, и более длинный, и более компактный варианты обречены на неудачу, если внося новый счет бухгалтер стукнет не точку, а запятую... Или создаст четырехзначный субсчет... Ну вот захотелось им иметь 811,1006,112 и плевать, что база перестала работать...
Можно вопрос?
AS INTEGER - это преобразование найденного текста в число  Да уж...?
Не то я не нашла как это сделать.
Вся конструкция CAST( <чего-то-там-символьного-формата> AS INTEGER ) - преобразование первого операнда к типу, который указан после AS.
Только с ним SQL "ругается" -  requires FROM in statement
Как это "нет FROM"?!! Вот же он, последняя строка - FROM "СПРАВОЧНИК СЧЕТОВ"
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #5: 1 Ноябрь 2013, 10:23 »

Теперь другое сообщение об ошибке. Чего-то не хватает в АОО.BASE или что-то с типом данных?

[вложение удалено Администратором]
Записан

Яна (in real)
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #6: 1 Ноябрь 2013, 10:35 »

А у тебя все-все счета по одной маске сделаны? Цифры-точка-цифры-точка-цифры? А то, похоже, SELECT где-то не смог вырезать цифры до-после-между точками.
Покажь-ка таблицу с данными... И, наверное, не скриншотом, а хотя бы скопипасти значения... А то так обломно с твоих картинок тестовые данные руками перебивать...
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #7: 1 Ноябрь 2013, 10:41 »

А у тебя все-все счета по одной маске сделаны? Цифры-точка-цифры-точка-цифры? А то, похоже, SELECT где-то не смог вырезать цифры до-после-между точками.

Ooooops  Грустный

Нет, конечно. Таблица на 396 записей. Даю базу.

Вот как выборку писала я:
Код:
SELECT VALUE,"SCHET", SUBSTRING("SCHET",1,4)||'00'||SUBSTRING("SCHET",5,1) AS S,LENGTH(RTRIM("SCHET")) AS "DLINA", gr1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (5)
UNION
SELECT VALUE,"SCHET", SUBSTRING("SCHET",1,4)||'00'||SUBSTRING("SCHET",5,2)||'0'||SUBSTRING("SCHET",7,1) AS S,LENGTH(RTRIM("SCHET")) AS "DLINA", gr1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (7) AND SUBSTRING("SCHET",6,1)='.'
UNION
SELECT VALUE,"SCHET", "SCHET" AS S,LENGTH(RTRIM("SCHET")) AS "DLINA", gr1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (7) AND SUBSTRING("SCHET",6,1)<>'.'
UNION
SELECT VALUE,"SCHET", "SCHET" AS S,LENGTH(RTRIM("SCHET")) AS "DLINA", gr1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (1,2,3,4)
union
SELECT VALUE,"SCHET", SUBSTRING("SCHET",1,4)||'0'||SUBSTRING("SCHET",5,2)||'.0'||SUBSTRING("SCHET",8,1) AS S,LENGTH(RTRIM("SCHET")) AS "DLINA", gr1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (8) and SUBSTRING("SCHET",7,1)='.'
union
SELECT VALUE,"SCHET", SUBSTRING("SCHET",1,4)||'00'||SUBSTRING("SCHET",5,2)||'0'||SUBSTRING("SCHET",8,1) AS S,LENGTH(RTRIM("SCHET")) AS "DLINA", gr1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (8) and SUBSTRING("SCHET",7,1)<>'.'
UNION
SELECT VALUE,"SCHET", SUBSTRING("SCHET",1,4)||'0'||SUBSTRING("SCHET",5,2)||SUBSTRING("SCHET",7,3) AS S,LENGTH(RTRIM("SCHET")) AS "DLINA",GR1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (9)
UNION
SELECT VALUE,"SCHET", SUBSTRING("SCHET",1,4)||'0'||SUBSTRING("SCHET",5,2) AS S,LENGTH(RTRIM("SCHET")) AS "DLINA",GR1 FROM "СПРАВОЧНИК СЧЕТОВ" WHERE DLINA IN (6)

Во всяком случае результат визуально удобоваримый. Только теперь при выводе на печать мне нужны нормальные счета - не преобразованные  Смеющийся

[вложение удалено Администратором]
« Последнее редактирование: 1 Ноябрь 2013, 11:06 от adi_den2013 » Записан

Яна (in real)
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 1 Ноябрь 2013, 12:14 »

Попробуй Сервис-SQL, в окно "Выполняемая команда" вставь вот это:
Код:
CREATE VIEW "СЧЕТА" AS SELECT "СПРАВОЧНИК СЧЕТОВ".*,
( CAST( LEFT( "SCHET", LOCATE( '.', "SCHET" || '.' ) - 1 ) AS INTEGER ) * 1000
+ CAST( SUBSTR( "SCHET" || '.0', LOCATE( '.', "SCHET" || '.0' ) + 1,
LOCATE( '.', "SCHET" || '.0.', LOCATE( '.', "SCHET" || '.0.' ) + 1 )
- ( LOCATE( '.', "SCHET" || '.' ) + 1 ) ) AS INTEGER ) ) * 1000
+ CAST( SUBSTR( "SCHET" || '.0.0', LOCATE( '.', "SCHET" || '.0.0', LOCATE( '.', "SCHET" || '.0.0' ) + 1 ) + 1,
( LOCATE( '.', "SCHET" || '.0.0.', LOCATE( '.', "SCHET" || '.0.0', LOCATE( '.', "SCHET" || '.0.0',
LOCATE( '.', "SCHET" || '.0.', LOCATE( '.', "SCHET" || '.' ) + 1 ) ) ) + 1 ) - 1 )
- LOCATE( '.', "SCHET" || '.0.0', LOCATE( '.', "SCHET" || '.0.0',
LOCATE( '.', "SCHET" || '.0.', LOCATE( '.', "SCHET" || '.' ) + 1 ) ) ) ) AS INTEGER )
AS "DIGIT_SCHET" FROM "СПРАВОЧНИК СЧЕТОВ"
После "Выполнить" в окошке Состояние должно выскочить "Команда выполнена успешно."
Теперь переключаешься на Таблицы, из меню выбираешь Вид-Обновить таблицы.
Среди таблиц должна появиться вьюха с именем СЧЕТА. Последняя колонка в ней - DIGIT_SCHET - должна сортироваться нормально, минимумы-максимумы выдавать и всё такое... А для отчетов, само собой, нужно использовать значение "SCHET" из той же строки.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #9: 1 Ноябрь 2013, 12:44 »

Вьюха создалась успешно. Спасибо!
Записан

Яна (in real)
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #10: 1 Ноябрь 2013, 13:02 »

Тебе спасибо! За образец данных.  Всё хорошо
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #11: 1 Ноябрь 2013, 13:06 »

Особо не за что.
Бум стремиться к совершенству  Улыбка.
Записан

Яна (in real)
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #12: 4 Ноябрь 2013, 08:39 »

Образовалась маленькая проблемка: пары субсчетов 801.01 и 801.001, 811.01 и 811.001 преобразовались одинаково 801001000  Да уж.... Наверное, нужно предусмотреть условие ХХХ.ХХХ.ХХ?

Что-то не выходит у меня  Обеспокоенный


*********************
П.С.

Пока вышла из положения не преобразованием к шаблону, а заменой '.' на '0'
CREATE VIEW "SCHETA"  AS SELECT "СПРАВОЧНИК СЧЕТОВ".*,  CAST(REPLACE(SCHET,'.','0') AS INTEGER) AS S FROM "СПРАВОЧНИК СЧЕТОВ"
« Последнее редактирование: 4 Ноябрь 2013, 10:21 от adi_den2013 » Записан

Яна (in real)
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #13: 4 Ноябрь 2013, 10:44 »

Блин! Надеялся пронесёт, ан нет - не пронесло... Подводные камни учуял сразу, как только увидел в твоей таблице субсчета .01, .02 и т.д.
Вот ты мне скажи, а какой такой тайный смысл в этих нулях? Чем счет 811.1 будет отличаться от 811.01 и уж тем более от 811.001?
Я в своё время пытался у бухгалтеров выяснить эту страшную тайну, но в ответ обычно слышал какой-то околонаучный бред типа, "Ну вот объясню на примере... Допустим нам на 63-ий счет приходит 100... Нет, лучше 2000... Вот... А потом часть из этих денег должна уйти на 73-ий, а остальное разделиться между ...-надцатым и ...-ым счетами и параллельно зафиксироваться на забалансовом ...-ом счете..." И такие "объяснения" могли продолжаться часами и так никогда и не добраться до сути вопроса - нужен ли этот ноль в номере субсчета и какую роль он играет?!!

П.С. Прямая замена точки на ноль - плохая идея... Порядок сортировки будет перевран. То есть, нарвёшься на ту же самую ерунду при выборе МИН и МАКС, с которой эта тема начиналась  Грустный
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
adi_den2013
Форумчанин
***
Offline Offline

Пол: Женский
Расположение: Донецкая обл.
Сообщений: 259


« Ответ #14: 4 Ноябрь 2013, 10:54 »

Потому, что есть группы счетов
801.01-801.04.2

801.001-811.007 (с 3-мя нулями только эта группа) и на ней висят немалые суммы

Как мне их выделить?

А если потом дополнить нулями в конце REPLACE(SCHET,'.','0') до необходимой длины->RPAD(SCHET,LENGTH(SCHET),'0')? Только ошибка опять  Злой
« Последнее редактирование: 4 Ноябрь 2013, 10:57 от adi_den2013 » Записан

Яна (in real)
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!