Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Задачи для обучения SQL-запросам в Супермаге : Программирование

17.05.2024 7:50


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, время: 07:50.

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