Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
Здравствуйте, прошу ткнуть носом в проблему, составил запрос работает:
SELECT (SELECT C_NAME FROM ST_ABONENTS WHERE ST_ABONENTS.ID = t.C_AB_REF) as ABONENTNAME,
COUNT(q.C_ST) as CNT
FROM QRY_QUEUE q JOIN QRY_TYPE t on q.C_QRY_TYPE = t.ID
WHERE q.C_ST = 0
GROUP BY t.C_AB_REF
ORDER BY CNT ASC
Пытаюсь сделать так чтобы выводило строки где CNT меньше 20
SELECT (SELECT C_NAME FROM ST_ABONENTS WHERE ST_ABONENTS.ID = t.C_AB_REF) as ABONENTNAME,
COUNT(q.C_ST) as CNT
FROM QRY_QUEUE q JOIN QRY_TYPE t on q.C_QRY_TYPE = t.ID
WHERE q.C_ST = 0 AND CNT < 20
GROUP BY t.C_AB_REF
ORDER BY CNT ASC

ругает что cnt нет, что я делаю не так?
Заранее спасибо
22 авг 16, 17:46    [19574886]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
having
22 авг 16, 17:54    [19574913]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
Elic
Member

Откуда:
Сообщений: 29980
STFF column expression alias
22 авг 16, 17:57    [19574924]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
dmdmdm,

спасибо, заработало HAVING COUNT(q.C_ST) < 20
но почему не заработало HAVING CNT < 20
22 авг 16, 18:05    [19574962]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
всё прочитал в документации, что алиасы нельзя использовать везде, если можно ещё вопрос,
SELECT (SELECT C_NAME FROM ST_ABONENTS WHERE ST_ABONENTS.ID = t.C_AB_REF) as ABONENTNAME,
COUNT(q.C_ST) as CNT
FROM QRY_QUEUE q JOIN QRY_TYPE t on q.C_QRY_TYPE = t.ID
GROUP BY t.C_AB_REF

как в таком запросе вывести 1 строку?
Извините за глупые вопросы раньше работал с mysql там проще, тут ROWNUM = 1 ломает CNT
22 авг 16, 18:11    [19574992]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
Дочитайте доку.
22 авг 16, 18:12    [19574995]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
вывести 1 строку?


Одну строку или первую строку?
Rownum ничего не ломает, его надо научиться использовать.
Одну строку получится, если у вас одна группа.
Первую, вторую, энную - select from (order by "критерий - что такое первая, вторая, ... ?") where rownum = n.
22 авг 16, 18:15    [19575003]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
Elic
Member

Откуда:
Сообщений: 29980
dmdmdm
where rownum = n.
Только чушь пороть не надо.
22 авг 16, 18:21    [19575030]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
dmdmdm,

SELECT
(SELECT C_NAME FROM ST_ABONENTS WHERE ST_ABONENTS.ID = t.C_AB_REF) as ABONENTNAME,
COUNT(q.C_ST) as CNT
FROM QRY_QUEUE q JOIN QRY_TYPE t on q.C_QRY_TYPE = t.ID
GROUP BY t.C_AB_REF
ORDER BY CNT DESC

пытаюсь вывести с этого запроса 1 строчку, и если делаю так:

SELECT
(SELECT C_NAME FROM ST_ABONENTS WHERE ST_ABONENTS.ID = t.C_AB_REF) as ABONENTNAME,
COUNT(q.C_ST) as CNT
FROM QRY_QUEUE q JOIN QRY_TYPE t on q.C_QRY_TYPE = t.ID
WHERE ROWNUM = 1
GROUP BY t.C_AB_REF

То выдёргивает 1 строчку не из моей выдачи, а скорее всего из таблицы, а мне нужно именно в этой выдаче
22 авг 16, 18:21    [19575034]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
Elic, да, пардон, виноват. rownum надо во внутреннем запросе поименовать.
22 авг 16, 18:22    [19575041]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
select *
from
( SELECT
(SELECT C_NAME FROM ST_ABONENTS WHERE ST_ABONENTS.ID = t.C_AB_REF) as ABONENTNAME,
COUNT(q.C_ST) as CNT
FROM QRY_QUEUE q JOIN QRY_TYPE t on q.C_QRY_TYPE = t.ID
GROUP BY t.C_AB_REF
ORDER BY CNT DESC
)
where rownum = 1

нашёл такой солюшен, но я так понял это не более чем костыль?
22 авг 16, 18:25    [19575051]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
where rownum = 1 - сработает для первой строки

для любой строки по заданному критерию надо так

with t as
 (select 1 n
    from dual
  union all
  select 3
    from dual
  union all
  select 100
    from dual)
select n, rn
  from (select n, rownum rn from (select t.* from t order by n desc))
 where rn = 3


То, что вы изучали другую СУБД - не повод спрашивать на форуме, не читая доку.
22 авг 16, 18:29    [19575062]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
спасибо за направление :)
22 авг 16, 18:32    [19575068]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
kirillsayapin
нашёл такой солюшен, но я так понял это не более чем костыль?

Что есть "не более чем костыль", а что - "более"?
Вот это костыль или нет?
https://docs.oracle.com/database/121/DWHSG/analysis.htm#DWHSG9188
22 авг 16, 18:32    [19575070]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
dmdmdm
для любой строки по заданному критерию надо так

В общем случае так не надо с 10g, когда появилась аналитика.
А экпириенс иногда обновлять - как раз надо.
Тем более что в 12 к аналитике добавлен синтаксический сахар в виде "fetch N rows only"
22 авг 16, 18:35    [19575077]     Ответить | Цитировать Сообщить модератору
 Re: Объявление переменной внутри запроса  [new]
kirillsayapin
Member

Откуда:
Сообщений: 8
andrey_anonymous,

менее костыль это то, что разработчик предложил на этот случай, например в mysql это LIMIT, но я так понял что в oracle всё немного специфичное

В любом случае спасибо, правильно дали направление
22 авг 16, 21:39    [19575792]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить