Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как составить сложный запрос ? [IB4.x, IB5.x, IB6.x, FireBird]


Страницы:   1 2

Вопрос ©   (2008-04-16 22:29:00) 

Есть три таблицы,

1. DOC - Шапка накладной (ключ - Num, Klient - связь с KLN, Data)
2. TOV - Товары накладной (Num - связь с DOC; Кол-во, Цена)
4. KLN  - Клиенты (Klient - ключ, Kod, Name)

нужно сделать запрос, который показывает за период с 01.01.2002 по 12.12.2002 следующее все вместе:

1.Клиент (код и Name)
2.Кол-во заказов из DOC для каждого клиента
3.Сумма заказов (т.е. кол-во всех товаров по всем накл.* цену товара) для каждого клиента
4.Кол-во товаров по всем накладным для каждого клиента

максимум до чего я дошел, так это

select KLN.KLient, KLN.Kod, count(Doc.Num) from KLN,DOC where (Doc.Data>='01.01.2002' and Doc.Data<='01.12.2002') and DOC.NUM=KLN.NUN group by KLN.KLient, KLN.Kod

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

FB/IB


Вопрос   (2008-04-17 15:29:00) [21]

не получается нифига, условия отсекают друг друга... и QUANT_DOC AS и QUANT оказывается равным друг другу... то есть количство документов - равным количеству товаров в этих документах... :/


Вопрос   (2008-04-17 14:30:00) [22]

а мож и нет.. :/


Вопрос   (2008-04-17 14:21:00) [23]

вообще по-моему, этот запрос не верный, PEAKTOP...

тут надо что-то вроде JOIN наверное... а то у вас все условия прилагаются на все... и на дате где должно быть 200 клиентов оказываются 2... каким-то образом...


Вопрос   (2008-04-17 14:12:00) [24]

ммм... а зачем DOC.Klient+0) = K.Klient если он и так делает группировку по K.Klient ? или я чего-то не понимаю...


Вопрос   (2008-04-17 09:22:00) [25]

SUM(TVR."Кол-во") AS QUANT - сейчас посмотрел, тут не то...

в "кол-ве" содержится кол-во конкретного товара в каждой накладной, а посчитать-то надо записи товаров - сколько было всего товарных записей.

ну, 1. Кирпичи   22
    2. Цемент    22
    3. Шифер     22

здесь Quant должен быть не 66, а 3

тогда - Сount(TVR."Кол-во") AS QUANT , да ?


PEAKTOP   (2008-04-16 23:45:00) [26]

> а в чем смысл выражений ((TVR.Num+0) и ((DOC.Klient+0) ?
зачем там 0 приплюсовывается ?


Это привычка уже просто... :)

На самом деле - этот запрос написан для оптимизатора запросов Firebird, как он поведет себя в InterBase - бог его знает, года четыре его не видел.

В Firebird-е такой изврат позволяет в запросах явно рулить использованием индексов без статического указания плана, которое не есть кошерным в виду разного принципа работы оптимизаторов Firebird v1.5 и Firebird старше v2.0.


Вопрос   (2008-04-16 23:21:00) [27]

Сергей М, что есть ОБЭП ?

и зачем там +0... :>


Сергей М,   (2008-04-16 23:18:00) [28]


> Вопрос   (16.04.08 23:12) [4]


Для меня нет, для ОБЭП - оч даже существенно)
Но на то и оффтоп)


Вопрос   (2008-04-16 23:12:00) [29]

Сергей М, а что, остальное существенно для выполнения запроса ? :>

PEAKTOP, спасибо. блин, про существование sum я и вовсе забыл... вот как бывает когда давно не пишешь... :)
блин "DOC.NUM=KLN.NUN" :)

а в чем смысл выражений ((TVR.Num+0) и ((DOC.Klient+0) ? зачем там 0 приплюсовывается ?


Johnmen   (2008-04-16 23:02:00) [30]


> что это за шарашкина контора,

Это не контора, это задание дал препод. Завтра сдавать, а ещё даже терминология не изучена...:))


Сергей М,   (2008-04-16 22:52:00) [31]


> 2. TOV - Товары накладной (Num - связь с DOC; Кол-во, Цена)


Оффтоп: что это за шарашкина контора, в накладных которой фигурирует только колво и цена ? Что это за безликий товар такой у этой конторы ?)


PEAKTOP   (2008-04-16 22:45:00) [32]


SELECT K.Klient, K.Kod, COUNT(DOC.Num) AS QUANT_DOC, SUM(TVR."Кол-во" * TVR."Цена") AS SUM_ORD, SUM(TVR."Кол-во") AS QUANT
FROM   "Клинты" K, "Шапка накладной" DOC, "Товары накладной" TVR
WHERE ((DOC.Klient+0) = K.Klient)
 AND   (DOC.Data >= '01.01.2002 00:00:00')
 AND   (DOC.Data <= '01.12.2002 23:59:59')
 AND   ((TVR.Num+0) = DOC.Num)
GROUP BY K.Klient, K.Kod


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо