[ТЕМА ЗАКРЫТА]
13.10.2014 11:15
BotMan
 
собственно почитываю SQL так как буратинко я.
есть небольшая просьба, немного помочь с обучение, конечно если не сложно. киньте пару простых задачек(На select ), типа найти количество такого-то артикула ну или что-нибудь в этом духе, и подсказка: использовать таблицы SMgoods и т.д.

заранее большое спасибо )
13.10.2014 11:45
OlegON
 
Ну, например, вывести перечень и количество документов, созданных за сутки от момента запуска скрипта. С группировкой по типу и расшифровкой типа. Т.е. список вида:

Приходная накладная 1000
Акт переоценки 200
...

все подсказки есть в описании структуры БД :)
13.10.2014 11:47
BotMan
 
Цитата:
OlegON
все подсказки есть в описании структуры БД :)


вообще огонь 8))))
спасибо, ушел читать структуру БД 8)
13.10.2014 11:55
OlegON
 
Т.е. задачка слишком сложная, поскольку надо в условии описывать откуда что брать? Ты посмотри тогда по слову select на форуме, задачек-то много подобных...
Начни с таблички smdoclog...
13.10.2014 13:28
BotMan
 
вот к такому варианту пришел быстро, что делать дальше хз ))
не знаю как расшифровать тип

select doctype Документ, count(doctype) Количество from smdoclog
where docdate = '13.10.2014'
group by doctype
13.10.2014 13:32
Micle
 
join с таблицей содержащей названия типов. И конечно чтение докции по JOIN оставляю за Вами. ;) Учиться так учиться!
13.10.2014 14:10
OlegON
 
И нарушено условие по "за сутки от момента запуска скрипта", читаем про sysdate.
13.10.2014 14:16
BotMan
 
не могу найти таблицу содержащую название типов, возможно нашел, как в ней вообще выглядят эти названия? ))
13.10.2014 16:23
BotMan
 
короче уперся в дату, запрос проходит без ошибки, но ничего не выводит...

и еще, как лучше писать через INNER JOIN или просто через Запятую?


select ss.typename Документ, count(ss.typename) Количество from smdoclog s, ssobjecttypes ss
where s.docdate BETWEEN sysdate and sysdate -1
and ss.objtype = s.doctype
group by ss.typename

=============================
INNER JOIN

select ss.typename Документ, count(ss.typename) Количество from smdoclog s INNER JOIN ssobjecttypes ss
ON (s.docdate = BETWEEN sysdate and sysdate -1 and ss.objtype = s.doctype)
group by ss.typename
13.10.2014 17:40
BotMan
 
вариант №2

select ss.typename Документ, count(ss.typename) Количество from smdoclog s, ssobjecttypes ss
where (s.docdate = trunc(SYSDATE) or s.docdate = trunc(SYSDATE)-1)
and ss.objtype = s.doctype
group by ss.typename
13.10.2014 17:51
vdm
 
Цитата:
BotMan короче уперся в дату, запрос проходит без ошибки, но ничего не выводит...
В BETWEEN параметры должны идти от меньшего к большему.
И по условию смотреть нужно не дату документа, а время его изменения - eventtime.

Цитата:
и еще, как лучше писать через INNER JOIN или просто через Запятую?
Читал про проблемы с JOIN на версиях оракла ниже 10. Далее не в курсе.
Мне через запятую удобнее.
13.10.2014 17:55
OlegON
 
А при чем тут docdate? Вот, я написал бы вроде такого:
Код:
select ss.typename, count(ss.typename) 
from supermag.smdoclog s, supermag.ssobjecttypes ss
where s.eventtime>sysdate -1
and ss.objtype = s.doctype
group by ss.typename order by 2 desc;
давай тогда для понимания, выбери уникальные значения docdate из supermag.smdoclog и отсортируй их по возрастанию...
13.10.2014 18:25
BotMan
 
Цитата:
OlegON А при чем тут docdate?
ну я подумал что eventtime это время изменения документа, а docdate дата создания.
13.10.2014 18:33
BotMan
 
select docdate from smdoclog
order by 1 asc
13.10.2014 18:35
BotMan
 
select distinct docdate from smdoclog

order by 1 asc
13.10.2014 19:10
OlegON
 
правильно, только вот для кода соответствующий тег на форуме есть, читаемость повышает.
еще аналогичная задачка - сделать вывод по количеству, как с документами, только с выводом и расшифровкой сотрудников. Т.е. в выборку выше по докам добавить детализацию по сотрудникам (smstaff).
13.10.2014 21:02
Micle
 
Олег, я не силён в оракле, но полагаю, что через запятую джойнить таблицы несколько расточительно. Тут left join на мой взгляд смотрелся бы куда лучше. Или у оракла нет такового (сильно сомневаюсь) ?
13.10.2014 21:53
OlegON
 
Цитата:
Micle Олег, я не силён в оракле, но полагаю, что через запятую джойнить таблицы несколько расточительно. Тут left join на мой взгляд смотрелся бы куда лучше. Или у оракла нет такового (сильно сомневаюсь) ?
Я тоже не силен в программировании Oracle, но в нем поддерживается LEFT JOIN (т.е. ANSI-нотация) и есть LEFT JOIN, который можно было бы записать так
Код:
select ss.typename, count(ss.typename) 
from supermag.smdoclog s, supermag.ssobjecttypes ss
where s.eventtime>sysdate -1
and ss.objtype = s.doctype(+)
group by ss.typename order by 2 desc;
т.е. в оракловой нотации. ANSI-варианты кое-как терпимо и без багов стали работать в 11 версии, хотя сам Том Кайт рекомендовал их использование еще в 10 версии. Я с самого начала пользовался оракловой нотацией, поэтому ANSI пользоваться не люблю, не умею. Но не поленился, переписал и сравнил планы
Код:
select ss.typename, count(ss.typename) 
from supermag.ssobjecttypes ss
left join supermag.smdoclog s on
(ss.objtype = s.doctype and s.eventtime>sysdate -1)
group by ss.typename order by 2 desc;
практически идентичны, т.е. расход ресурсов даже на весьма значительной по размерам БД абсолютно одинаковый.
14.10.2014 11:33
BotMan
 
в общем вот, что получилось, не уверен что правильно, так как не знаю, что за что цеплять
Код:
select ff.serverlogin, p.typename,  count(p.typename) from smstaff ff, 
(select s.username, ss.typename from supermag.smdoclog s, supermag.ssobjecttypes ss
where s.eventtime>sysdate -1
and ss.objtype = s.doctype(+)
) p
where ff.serverlogin=p.username
group by p.typename, ff.serverlogin order by 1 desc
и хотел спросить, что означает этот (+) ??
14.10.2014 11:47
OlegON
 
(+) обозначает LEFT OUTER JOIN или RIGHT OUTER JOIN, т.е. в данном случае, если справа не будет хватать пары для левого значения, значение будет все равно выведено в паре с NULL.
Некогда малость, но без вложенного запроса никак?
14.10.2014 12:10
BotMan
 
вот как то так.


Код:
select ff.serverlogin Сотрудник, ss.typename Документ, count(ss.typename) Количество from smstaff ff, smdoclog s, ssobjecttypes ss
where s.eventtime>sysdate-1
and ss.objtype = s.doctype(+)
and ff.serverlogin=s.username
group by ss.typename, ff.serverlogin order by 3 desc
не уверен в правильности, честно говоря. хотя запрос проходит без ошибок, возвращает данные.

что-то эти Where И and and мне кажутся подозрительными
14.10.2014 12:29
Micle
 
Да вроде ничего подозрительного.

Код:
ss.objtype = s.doctype(+)
and ff.serverlogin=s.username
условия, задающие критерии связывания таблиц.


Код:
s.eventtime>sysdate-1
условие отбора событий по времени.
14.10.2014 12:34
BotMan
 
а есть ли принципиальная разница в написании с под запросами или без??
14.10.2014 12:35
OlegON
 
С подзапросами, как правило, тормознее.
14.10.2014 16:09
BotMan
 
может еще что-нибудь, такого плата?
14.10.2014 16:31
Mtirt
 
Можешь теперь посчитать сколько раз в этих документах встречается заданный артикул товара?
15.10.2014 12:28
BotMan
 
Код:
select article, count(article) from smspec sp, smdoclog s
where s.eventtime>sysdate-1
and  s.id = sp.docid
and sp.article = 'xxxxxx'
group by article


Опции темы


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

 

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