[ТЕМА ЗАКРЫТА]
15.10.2014 13:04
Mtirt
 
1. Надо научиться передавать параметр в запрос. А не менять запрос при смене параметра.
2. Что будет, если у тебя встретятся два документа разных типов с одинаковым номером (Супермаг такое позволяет)?
15.10.2014 14:05
BotMan
 
2) select sp.article, count(sp.article) from smspec sp, smdoclog s
where s.eventtime>sysdate-1
and s.id = sp.docid
and s.doctype = sp.doctype
and sp.article = xxxxxxx
group by sp.article

второй пункт поправил, возможно так.

подсказочку можно на первый пункт?
15.10.2014 14:22
OlegON
 
Цитата:
BotMan подсказочку можно на первый пункт?
dbms_sql.bind_variable
15.10.2014 18:15
BotMan
 
что-то не могу догнать!
мысли есть такие:
что должен создать переменную, которая будет принимать значение и уже эту переменную передать в sp.article

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

DECLARE
N_article:= ???

просто не могу понять механизма... подскажите плз )
15.10.2014 18:30
OlegON
 
Эээм, не слишком я тебе прямую подсказку дал...
В общем, суть использования подставных переменных сильно зависит от того, в какой среде ты запускаешь скрипт.
Например, в большинстве Delphi-оберток, это будет :переменная, если из SQL Plus - &переменная.

Код:
select sp.article, count(sp.article) from smspec sp, smdoclog s
where s.eventtime>sysdate-1
and s.id = sp.docid
and s.doctype = sp.doctype
and sp.article = &article
group by sp.article
и запускай в SQL Plus
15.10.2014 18:53
BotMan
 
блин, я в pl/sql Developer кручу-чуму
15.10.2014 18:58
OlegON
 
Цитата:
BotMan блин, я в pl/sql Developer кручу-чуму
Ворованный, наверное? :(
Он на Delphi... Т.е. в силе :variable
15.10.2014 20:21
BotMan
 
Цитата:
OlegON Ворованный, наверное? :(
Он на Delphi... Т.е. в силе :variable
триал
16.10.2014 07:02
Mtirt
 
Цитата:
OlegON Ворованный, наверное? :(
Он на Delphi... Т.е. в силе :variable
Наоборот.
В PL/sql developer в качестве обозначения переменной используется &.
16.10.2014 07:59
OlegON
 
Цитата:
Mtirt Наоборот.
В PL/sql developer в качестве обозначения переменной используется &.
Я его не видел уже много лет, но ты точно не путаешь с оракловым?

16.10.2014 08:04
Mtirt
 
Я его использую. Каждый день. Я не могу перепутать.
В запросах - &.

А то, что ты показываешь - блоки PL/SQL кода, синтаксис которого не зависит от используемого инструмента. :)
16.10.2014 08:13
OlegON
 
Тоже ворованный? ;) Я из SQL Plus не вылезаю. Ну, главное - разобрались...
16.10.2014 10:25
BotMan
 
Это все очень замечательно, а не могли бы вы на моем примере показать полный вариант, а по нему я уже разберусь. Это существенно облегчило бы мне жизнь, а то ночами уже не сплю ))
16.10.2014 10:33
Mtirt
 
Так Олег же тебе выше написал:
Задачи для обучения SQL-запросам в Супермаге

Там всё правильно. Или что-то не работает?
16.10.2014 10:50
BotMan
 
все замечательно работает, просто немного запутался в ваших дебатах и решил немного конкретики вытащить 8) и до базы только дорвался.
16.10.2014 11:19
Mtirt
 
Продолжим?
Задача, которая встречается всегда и у всех:
посчитать реализацию товаров по кассовым документам по выбранной группе товаров в разрезе артикулов товаров по выбранному магазину.
При этом, надо помнить, что по создается два документа: продажи и возврат от покупателя.
Я прошу количество и сумму возврата отнять от общих продаж.
Ну и, чур, в форум не поглядывать...
В форуме достаточно много примеров запросов на реализацию.
21.10.2014 14:18
Mtirt
 
А что за тишина в ветке? Я задала слишком сложную задачу?
Что-то не получается?
21.10.2014 15:53
twix
 
SELECT 'HELLO WOLRD' AS `HURRAH` же, не?
22.10.2014 10:53
BotMan
 
Цитата:
Mtirt А что за тишина в ветке? Я задала слишком сложную задачу?
Что-то не получается?
прошу прощения, просто не было времени. только в первый день уделил немного времени. сел разбираться.
22.10.2014 12:08
BotMan
 
Код:
select sp.article, sp.doctype, sp.docid,  sp.quantity from smspec sp, smcard crd, (select doctype, id from smdocuments
where (doctype = 'CS' or doctype = 'CR')
and createdat = &date) DC
where sp.docID = DC.ID
and sp.article = crd.article
--and crd.idclass = &grp

собственно есть вариант, выборки. но я боюсь ошибиться в таблица.
сперва отобрал доки по дате создания, а потом из них отобрал артикулы по группе товаров...
22.10.2014 13:34
Mtirt
 
1. Это "реализация" за конкретную дату. Что будет, если нужно будет посчитать за период? За месяц, например?
2. Мне не нравится вложенный запрос. Я вообще не понимаю, зачем он здесь нужен. У тебя в предыдущем запросе было соединение таблиц smspec и smdocuments. Используй его.
3. Я просила отнять возвраты по кассе. Ты их сложил с общей реализацией. (Подсказки: union all, decode (относятся к двум разным способам расчета)).
4. Условие на группу товаров (которое не получилось и ты его закомментировал).
Если нам надо будет выбрать по всем товарам группы первого уровня?
Часто в этой ситуации используется конструкция в виде "crd.idclass in (select is from sacardclass where tree like '2.%')".
Разбери её, посмотри, что и за что отвечает...
24.10.2014 11:42
BotMan
 
Код:
select sp.article, sp.doctype, sp.docid

from smspec sp, smcard crd, smdocuments s

where (sp.doctype = 'CS' and sp.doctype = 'CR')
and s.id=sp.docid
and createdat between '&date1' and '&date2'
and sp.article = crd.article
and crd.idclass in (select idclass from sacardclass where tree like '1.%')
короче теряюсь в догадках....
24.10.2014 11:55
Mtirt
 
1. Где-то совсем потерялось количество...
2. Условие (sp.doctype = 'CS' and sp.doctype = 'CR') выполняться не будет никогда. У документа не может быть одновременно и тип 'CS', и тип 'CR'. Варианты исправления:
(sp.doctype = 'CS' OR sp.doctype = 'CR')
или
sp.doctype IN ('CS', 'CR').
3. То же замечание, которое было в прошлом задании, почему связываешь smspec и smdocuments только по номеру документа?
4. Почему createdat без псевдонима?
24.10.2014 12:17
BotMan
 
Код:
select sp.article, sp.doctype, sp.docid, sp.quantity

from smspec sp, smcard crd, smdocuments s

where (sp.doctype = 'CS'  or sp.doctype = 'CR')
and s.id=sp.docid
and s.createdat between '&date1' and '&date2'
and sp.article = crd.article
and crd.idclass in (select idclass from sacardclass where tree like '1.%')
опечатка была с OR

а createdat без псевдонима выполняется, вот и не поставил.
у меня не получается сложить отдельно CS отдельно CR и потом отнять!!!!
24.10.2014 12:33
Mtirt
 
Цитата:
опечатка была с OR
Про OR, с точки зрения читаемости запроса и скорости выполнения, предпочтительно использовать sp.doctype IN ('CS', 'CR').

Пропустил 3 пункт замечаний из предыдущего сообщения.

Цитата:
у меня не получается сложить отдельно CS отдельно CR и потом отнять!!!!
Вариант 1:
Вместо sp.quantity пишем конструкцию
Код:
decode(sp.doctype, 'CS', sp.quantity, 'CR', -sp.quantity)
Получаем значение sp.quantity в зависимости от типа документа с разными знаками.
Предлагаю почитать описание функций nvl(), decode() и конструкции case. Придумать примеры использования в запросах.
Вариант 2:
Конструкция union all (внешнее объединение)
Пишем 2 запроса (я упрощаю, пишу только ключевые для понимания запроса поля, хотя нужны все)
Код:
select sp.quantity where sp.doctype= 'CS'
union all
select -sp.quantity where sp.doctype= 'CR'
Правда опять таки, с точки зрения скорости вариант 1 лучше. Но для обучения лучше знать оба варианта.
24.10.2014 13:06
Mtirt
 
До sum мы еще не дошли :) Это следующий этап в нашем задании...
24.10.2014 13:38
OlegON
 
извини, но мне кажется, что decode в данном случае сильно ресурсоемкая ерунда :( проц враз ляжет.
24.10.2014 17:06
BotMan
 
select sp.article, sp.doctype, sp.docid, decode(sp.doctype, 'CS', sp.quantity, 'CR', -sp.quantity)

from smspec sp, smcard crd, smdocuments s

where sp.doctype IN ('CS', 'CR')
and s.id=sp.docid
and sp.doctype = s.doctype
and s.createdat between '&date1' and '&date2'
and sp.article = crd.article
and crd.idclass in (select idclass from sacardclass where tree like '1.%')


Опции темы


Часовой пояс GMT +3, время: 10:38.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.