Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

Как составить сложный запрос ?   Найти похожие ветки 

 
Вопрос   (2008-04-16 22:29) [0]

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

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


 
PEAKTOP ©   (2008-04-16 22:45) [1]


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


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


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


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


 
Johnmen ©   (2008-04-16 23:02) [3]


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

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


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

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

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

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


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


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


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


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

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

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


 
PEAKTOP ©   (2008-04-16 23:45) [7]

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


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

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

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


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

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

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

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

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

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


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

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


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

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

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


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

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


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

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


 
Johnmen ©   (2008-04-17 15:37) [13]

Конкурс песни в медицинском институте:
...
Песню: "Тихо сам с собою я веду беседу", - представила кафедра психиатрии.
...

(c)


 
Вопрос   (2008-04-17 15:39) [14]

Johnmen ©  ну раз никому сказать больше нечего-то


 
Вопрос   (2008-04-17 16:02) [15]

что ненормального в таком запросе : ?

SELECT  K.name, Count(DOK.DOK) FROM   DOK_ZAK_A1 DOK, S_KLIENT1 K;

Разве Group by обязательно должно применятся для агрегатных функций ?

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
user name required.

блин... :(


 
Johnmen ©   (2008-04-17 16:06) [16]

Как насчет букваря по SQL?


 
Вопрос   (2008-04-17 16:08) [17]

Johnmen © как насчет занятся ответами по делу ?


 
Вопрос   (2008-04-17 16:09) [18]

для чего именно этот форум и существует.


 
sniknik ©   (2008-04-17 16:13) [19]

> для чего именно этот форум и существует.
а мне нравится определение недавно прочитанное на sql.ru.

Вопрошающих "Для чего нужен форум?" направлять сюда.

По-моему все притензии тех, кто называет себя новичками, связаны с их восприятием форума как какого-то учебного учереждения с длительным циклом обучения. Например, с десятилетней школой. В которой их проведут с 1го по 10ый класс, старательно вдалбливая сначала азы, а потом по нарастающей все остальные знания. Не забывая при этом про выдачу и проверку домашних заданий, дополнительные занятия для отстающих, факультативы для любознательных и тд. Эдакие седые, мудрые и добрые гуру, окруженные выводком "птенцов", про каждого из которых гуру знает все с момента рождения. Знает чем болел, что любит есть на завтрак. Знает как с ним надо разговаривать и как его надо обучать. И потом машет вслед улетающему заматеревшему "птенцу" рукой, смахивая украдкой слезу.
Так вот, дорогие мои, все это лишь ваши иллюзии.

Форум - это ускоренные курсы решения проблемы. Которые уже подразумевают наличие базовых знаний. А "блеяние" насчет "играл-играл, угадал все буквы, но не смог прочитать слово" - это не для форума.
Для получения базовых знаний нужно образование. Либо самообразование (т.е. чтение документации), либо обучение (т.е. курсы). Но форуме нет времени для подбора методики общения с каждым вопрашающим.
Есть планка. Не выполнил ее - иди "расти".

P.S. Учитесь правильно задавать вопросы:
http://ln.com.ua/~openxs/articles/smart-questions-ru.html

(с) Glory


 
Anatoly Podgoretsky ©   (2008-04-17 16:15) [20]


> Разве Group by обязательно должно применятся для агрегатных
> функций ?

Не обязательно, только не стоит обижаться на декартово произведение и дурной результат.


 
Вопрос   (2008-04-17 16:16) [21]

sniknik как составить этот запрос ? Правильно.


 
Вопрос   (2008-04-17 16:17) [22]

Anatoly Podgoretsky ©   (17.04.08 16:15) [20]

> Разве Group by обязательно должно
Как тогда объясняется это сообщение об ошибке ?

Ваш запрос к сожалению не работает


 
Palladin ©   (2008-04-17 16:18) [23]


> sniknik ©   (17.04.08 16:13) [19]

здорово, мне понравилось
есть мысль... направлять всех сюда...
http://delphimaster.net/view/16-1208434700/


 
sniknik ©   (2008-04-17 16:20) [24]

> Как тогда объясняется это сообщение об ошибке ?
можно отсутствием желания читать хелп

вот тебе вариант с необязательным group
SELECT Count(DOK.DOK) FROM DOK_ZAK_A1 DOK, S_KLIENT1 K;
глупый (изза упомянутого декартового произведения) но рабочий


 
Вопрос   (2008-04-17 16:23) [25]

sniknik © он не выводит все требуемые поля.


 
Вопрос   (2008-04-17 16:24) [26]

хелп сейчас мне читать некогда просто. то есть я его читаю,


 
Вопрос   (2008-04-17 16:29) [27]

Palladin © боюсь, что если я сейчас вот эту проблему не разрешу, в последующие лет 10 направлятся туда (или сюда) не будет никакой необходимости. :(


 
Вопрос   (2008-04-17 16:31) [28]

помогите ж, блин :(


 
Anatoly Podgoretsky ©   (2008-04-17 16:54) [29]

> Вопрос  (17.04.2008 16:17:22)  [22]

> Ваш запрос к сожалению не работает

Такого сообщения ни разу не получал, даже и не знаю, что сказать.


 
Вопрос   (2008-04-17 16:58) [30]

Anatoly Podgoretsky сорри, не ваш а Реактора. Работает не так как нужно


 
MsGuns ©   (2008-04-17 21:29) [31]

В SQL-запросах для связки между собой двух и более таблиц используется одна из двух конструкций:

1-я

SELECT <Список полей табл.1>,<Список полей табл.2>
 FROM табл.1,табл.2
 WHERE (<поле1 табл.1>=<поле1 табл.2>) AND (<поле2 табл.1>=<поле2 табл.2>)...

В этом случае в результирующий НД будут выбрана информация только тех записей табл.1, которым найдены соотв.записи в табл.2 и к ним присоеденены данные из записей табл.2
Записи табл.1, которым не найдены "пары" из табл.2, выбраны не будут

2-я

SELECT <Список полей табл.1>,<Список полей табл.2>
 FROM табл.1 JOIN табл.2 ON
 (<поле1 табл.1>=<поле1 табл.2> AND <поле2 табл.1>=<поле2 табл.2>,...)

А вот здесь в вых набор попадут все записи табл.1, а вот поля из табл.2, для которых не нашлось записей-"пар" будут содержать пусто.
Впрочем, могут быть и варианты. Все зависит от точности использования ключевого слова JOIN, а точнее его небязательных "спутников": Left/Right и Inner/Outer

В любом случае не полнеитесь и почитайте хотя бы основы SQL (годится встроенная делфи-справка по Local SQL)


 
Вопрос   (2008-04-18 12:15) [32]

MsGuns, я читал "основы". И простые запросы составлял.  

Дело в том, что этот запрос не составлялся... И мне надо было срочно.  Теперь уже поздно. В результате, вероятно, он мне далее не понадобится. Как не понадобился последние 5 лет в таком объеме :(

Только из интереса  - Пробовал я как раз с where.
В правильном запросе, что мне показали (к сожалению нет его), использовался как раз left inner join если не ошибаюсь...

Ну и дело осложнялось GROUP и аггрегирующими функциями...
Вы б лучше готовый запрос дали, правильный - так легче было б разобратся.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.037 c
2-1208239581
Антон Вл.
2008-04-15 10:06
2008.05.18
ehLib


2-1208623339
Alexey
2008-04-19 20:42
2008.05.18
Как свернуть форму


15-1207224227
@!!ex
2008-04-03 16:03
2008.05.18
Работы для дизайнера нет? Удаленно или в Самаре


3-1192531929
NNH
2007-10-16 14:52
2008.05.18
Таблица из Экселя


11-1187366554
Vladimir Kladov
2007-08-17 20:02
2008.05.18
Версия 2.78





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский