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

Откуда:
Сообщений: 1
ВОт задание
Картинка с другого сайта.
вот мои таблицы которые начеркал
Картинка с другого сайта.


а команды
1) SELECT * FROM kniga WHERE (kol_ekz = 1)
2) SELECT kod_kn, № bileta FROM kniga, abiniment, ch WHERE Fio ="Мельников Николай Дмитриевич" GROUP BY kod_kn
3) SELECT fio_ch FROM ch, aboniment WHERE otmetka = no AND DATA

Помогите написать запросы или что-то поправить
21 дек 12, 02:24    [13663473]     Ответить | Цитировать Сообщить модератору
 Re: Sql запросы. Выборка данных Select.  [new]
Jonny540
Member

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

Сообщите сроки и суииу.
21 дек 12, 14:51    [13666134]     Ответить | Цитировать Сообщить модератору
 Re: Sql запросы. Выборка данных Select.  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
+ Таблицы
CREATE TABLE Books FREE (;
 Id I,;
 Author C(50),;
 Name C(100),;
 YearPubl N(4),;
 Price N(10),;
 Number N(4),;
 Annotation M,;
 Disposed L )
CREATE TABLE Readers FREE (;
 Id I,;
 FIO C(30),;
 Address C(50),;
 Phone C(10),;
 LibCard C(10) )
CREATE TABLE Abonement FREE (;
 Id I,;
 Id_Book I,;
 Id_Rreader I,;
 IssueDate D,;
 ReturnDate D )
+ Типа код
SET DATE GERMAN
CLOSE TABLES

* текущая двта
ldCurrentDate=DATE()

* книги, имеющиеся в одном экземпляре
SELECT * FROM books WHERE number=1

* книги из билета Мельникова Н.Д.
SELECT PADR(b.author-','-b.name,30) as name;
 FROM abonement a INNER JOIN books b ON a.id_book=b.id INNER JOIN readers r ON a.id_reader=r.id;
 WHERE r.FIO='Мельников Николай Дмитриевич'

* читатели с задолженностью больше 4 месяцев
SELECT r.FIO;
 FROM abonement a INNER JOIN readers r ON a.id_reader=r.id;
 WHERE ISBLANK(a.ReturnDate) AND GOMONTH(ldCurrentDate,-4)>a.IssueDate

* книга, наиболее популярная весной 2012
SELECT PADR(b.author-','-b.name,30);
 FROM books b INNER JOIN;
 (SELECT TOP 1 id_book, count(*) as cnt FROM abonement;
   WHERE IssueDate<={^2012-05-31} AND (ISBLANK(ReturnDate) OR ReturnDate>={^2012-03-01});
   GROUP BY id_book;
   ORDER BY cnt DESC) t ON b.id=t.id_book

* читатели, имеющие на руках книги на сумму более 1000
SELECT r.FIO;
 FROM abonement a INNER JOIN books b ON a.id_book=b.id INNER JOIN readers r ON a.id_reader=r.id;
 WHERE ISBLANK(a.ReturnDate) AND a.IssueDate<=ldCurrentDate;
 GROUP BY r.FIO;
 HAVING SUM(b.price)>1000
 
* книга с наибольшим количеством экземпляров в наличии
SELECT PADR(bk.author-','-bk.name,30);
 FROM books bk INNER JOIN;
 (SELECT top 1 b.id, (b.number-NVL(t.cnt,0)) as num;
   FROM books b LEFT JOIN;
   (SELECT id_book, COUNT(*) as cnt FROM abonement;
    WHERE ISBLANK(ReturnDate) AND IssueDate<=ldCurrentDate;
    GROUP BY id_book) t ON b.id=t.id_book;
   ORDER BY num DESC) tk ON bk.id=tk.id
Конечно, если нужны Id (книг, читателей), то можно убирать внешние SELECTы. Ну и если можно делать не в один запрос, а используя последовательность команд и запросов - то можно сделать и более оптимальные конструкции

P.S. Кстати, абонемент...
21 дек 12, 16:44    [13667378]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить