Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Открыть новую тему     Написать ответ в эту тему

Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
проблема в том, что иногда запрос может ничего не возвращать, потому что данные из таблицы перестают удовлетворять условиям выборки (в частности по времени).

В том решении, что я предложил запрос вернет всегда минимум 1 запись.
Человек пишет про то, что его это решение не устраивает по причине:

Цитата:
но мониторинг хочет на вход два параметра, так что если на входе будет один Idle = 0, то он все равно словит клина. Мониторинг хочет New = 0, In Progress = 0, если запрос ничего не возвращает.  
При том, что ответ сделан по его же примеру.
 

Цитата:
мониторинг просто запускает запрос [?] (без каких либо параметров) и ждет, что запрос вернет два значения. Если возвращается одно или вообще пусто, то ловит клина.
ну так и возвращаются 2 значения
 

Цитата:
Мониторинг хочет New = 0, In Progress = 0
где в примере автора соответствие этому если там CASE ?
 
Вот в чем проблема ну не понимаю и автор нормально не объясняет.

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 08:52 20-09-2018 | Исправлено: Mic777, 08:57 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, вот запрос без case - он ничего не возвращает, как правильно заметил Mavrikii
Цитата:
проблема в том, что иногда запрос может ничего не возвращать, потому что данные из таблицы перестают удовлетворять условиям выборки (в частности по времени).
 
В этой ситуации мониторинг хочет получить два значения: 0 и 0.
Таблица таже.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:54 20-09-2018
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
без case - он ничего не возвращает, как правильно заметил Mavrikii

case вообще не влияет на то сколько записей возвращается, он влияет на то, как их интерпретировать.
в вашем примере было что есть типа 7 статусов, и 1 - это New, остальные - Progress
ну так и добавьте по аналогии 0 - Idle как я писал выше:
 

Код:
 
select 0 as idstate, 0 as proc_count  
  from dual  
 where (  
 select count(*)
   from proc p  
 where p.idstate in (1, 7)  
   and p.summ > 0  
   and p.crtime between sysdate - 1 / 144 and sysdate
   and rownum <= 1  
 ) = 0  
 union all  
 

 
Что в этом то случае не устраивает я так и не понял
http://sqlfiddle.com/#!4/7127a8/31
 
 
Добавлено:
Mavrikii
 
удобных решений мало  
обычно используют что то вида  
 
Цитата:
If Exists (query)  
       (query)  
Else  
        SELECT 'Value 1', 'Value2'[/q]
 
то что я и предложил сразу, только вместо написания процедуры это все делается в запросе элементарно.

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 11:37 20-09-2018 | Исправлено: Mic777, 11:46 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, если смиксовать два запроса, то получится такой.
При выполнении выдает ошибку: ORA-01790: expression must have same datatype as corresponding expression.  
К тому же:
Код:
select 0 as idstate, 0 as proc_count  from dual
вернет:
idstate proc_count    
0 0  

А нужно, чтобы возвращал:
idstate proc_count    
New 0    
In Progress 0  

 

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 11:58 20-09-2018 | Исправлено: NiXXX, 11:59 20-09-2018
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
если смиксовать два запроса, то получится такой.  
При выполнении выдает ошибку: ORA-01790: expression must have same datatype as corresponding expression.  

Ну так внимательней миксовать надо. Я уже и пример готовый дал
Цитата:
http://sqlfiddle.com/#!4/7127a8/31  

 
Кто же число в результате первого запроса объединяет со строкой  'New' или 'In Progress' во втором.
 
Что касается решения - то это всего лишь пример, что можно использовать union all для достижения вашего требования получить в результате запроса хотя бы одну запись всегда.
А уже как отформатировать чтобы скушал мониторинг это другой вопрос, вам виднее должно быть и тут вообще не вижу проблемы.
 
Добавлено:

Цитата:
А нужно, чтобы возвращал:  

пожалуйста:
http://sqlfiddle.com/#!4/7127a8/42

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 12:28 20-09-2018 | Исправлено: Mic777, 12:34 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, агонь! Благодарствую!

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 13:02 20-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, столкнулся с интересным.
Выполняю простой запрос select a.c_id, a.c_number from acc a where a.id = :x and a.num = :y - PL/SQL Developer возвращает одну строку, ок. Вставляю тот же запрос в процедуру и ловлю ошибку "ORA-01422: exact fetch returns more than requested number of rows". Начинаю разбираться - видно, что запрос возвращает строку со значениями и пустую строку. WTF?! Почему?  
Вопрос конечно решается условием rownum = 1, но откуда берется пустая строка?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 16:01 24-09-2018
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Думаю пиэлю врать нет смысла, так что копай свою процедуру.
Комрады то ее не видят.

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 09:23 25-09-2018
Kmich



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
просто запрос может вернуть более чем одну строку вот и ругается что в процедуре это не приемлемо, сделать лучше через курсоры.

Всего записей: 192 | Зарегистр. 21-01-2005 | Отправлено: 06:56 28-09-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне кажется курсоры стоит использовать только в крайнем случае, по крайней мере в mssql это не самая быстрая функция

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 09:16 28-09-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Цитата:
Вопрос конечно решается условием rownum = 1
вопрос решается при помощи GROUP BY и агрегированию по полному списку полей выборки, а при помощи rownum = 1 ты ставишь костыль который в данной ситуации отрабатывает аналогично. Но ситуации бывают разные...

Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 15:54 28-09-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yurkesha

Цитата:
вопрос решается при помощи GROUP BY  

Если агрегирование не нужно, то проще DISTINCT использовать. По быстроте одинаково должно быть.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 16:17 30-09-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
судя по тому что NiXXX предполагает что его запрос должен возвращать именно одну строку - надо именно агрегировать притом не забыть ISNULL для числовых значений...

Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 19:01 30-09-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем +100500 в карму за советы!
Разобрался что к чему - разработчик ошибся в одной букве в имени переменной.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 13:49 10-10-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, тут мне снова прилетело в вентилятор
Есть список операций за месяц, необходимо отобрать записи, где для одного клиента было больше 5 операций за день и так за каждый день месяца. Причем отобрать необходимо именно те записи, которые идут > 5. В какую сторону мне копать?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:23 09-11-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
основа = клиент + день
Подзапрос: из даты вычленишь стандартной функцией день(естественно предварительно отфильтровав нужный месяц) - далее группировка по клиент день и допполе COUNT(*) - в нем получишь количество операций в день по клиенту для нужной выборки.
Ну и дальше просто - связка исходной таблицы с подзапросом по клиент + день
 
Добавлено:
А вот насчет
Цитата:
необходимо именно те записи, которые идут > 5
непонятно выражена мысль - если по конкретному клиенту за конкретный день есть 6 записей то должны в итоговой выборке получить 1? И если так то нужен критерий для отсеивания 5...

Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 12:36 09-11-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
NiXXX
основа = клиент + день

Ок, запросом вида:

Код:
select trunc(operdate), clientid, count(*) from table
where operdate between to_date('01.09.2018','dd.mm.yyyy') and to_date('30.09.2018','dd.mm.yyyy')
group by trunc(operdate), clientidhaving count(*) > 5;

я отберу даты и клиентов, у которых в эту дату было больше 5 операций.
Дальше, если я буду использовать из этой таблицы связку клиент + день и тянуть данные из "основной", то выберу все транзакции по клиенту за день. А надо только те, которые > 5.

Цитата:
непонятно выражена мысль - если по конкретному клиенту за конкретный день есть 6 записей то должны в итоговой выборке получить 1? И если так то нужен критерий для отсеивания 5...  

Именно - нужна 1 запись. Критерием может быть максимальный айдишник.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:45 09-11-2018 | Исправлено: NiXXX, 12:46 09-11-2018
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
удален алгоритм который по-видимому оказался бесполезным - судя по отсутствию отклика
сделаешь как тебе привычно - через курсор

Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 13:15 09-11-2018 | Исправлено: yurkesha, 17:57 10-11-2018
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Знатоки SQL, подскажите, как можно решить следующую задачу(диалект mssql). Имеется таблица в которой записи представлены плоским деревом(parent-child), глубина не ограничена, необходимо вернуть записи с каждого уровня и вроде бы просится сюда рекурсия на CTE, но не могу сообразить, как сделать проверку условия на некоторых уровнях.
 
Для примера возьмём следующий набор данных:

Код:
 
Id        ParentId        Level        Field
----------------------------------------------
1        null            0            SomeValue0
2        1                1            SomeValue1
3        1                1            SomeValue2
4        1                1            SomeValue3
5        2                2            SomeValue4
6        2                2            SomeValue5
7        3                2            SomeValue6
8        7                3            SomeValue7

 
На выходе я должен получить:
 

Код:
Id        ParentId        Level        Field
----------------------------------------------
1        null            0            SomeValue0
3        1                1            SomeValue2
7        3                2            SomeValue6
8        7                3            SomeValue7

 
Благодаря тому, что спустился от записи с ParentId = null, до самой вложенной записи по пути проверив, что на уровне 1 значение Field = SomeValue2 и на уровне 2 Field = SomeValue6. Можно и в обратном порядке child -> parent, тут закавыка, как на определённых уровнях проверять условие?

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 19:31 12-12-2018 | Исправлено: NeoAnomaly, 20:44 12-12-2018
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly

Цитата:
необходимо вернуть записи с каждого уровня


Цитата:
 
2        1                1            SomeValue1
3        1                1            SomeValue2
4        1                1            SomeValue3  

 
как из этого у вас получется 3-1-1 ?

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 23:50 12-12-2018 | Исправлено: YuriyRR, 23:52 12-12-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru