Конференция "Начинающим" » Как составить сложный запрос ? [IB4.x, IB5.x, IB6.x, FireBird]
 
  • Вопрос (16.04.08 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 © (16.04.08 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

  • Сергей М, (16.04.08 22:52) [2]

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


    Оффтоп: что это за шарашкина контора, в накладных которой фигурирует только колво и цена ? Что это за безликий товар такой у этой конторы ?)
  • Johnmen © (16.04.08 23:02) [3]

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

    Это не контора, это задание дал препод. Завтра сдавать, а ещё даже терминология не изучена...:))
  • Вопрос (16.04.08 23:12) [4]
    Сергей М, а что, остальное существенно для выполнения запроса ? :>

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

    а в чем смысл выражений ((TVR.Num+0) и ((DOC.Klient+0) ? зачем там 0 приплюсовывается ?
  • Сергей М, (16.04.08 23:18) [5]

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


    Для меня нет, для ОБЭП - оч даже существенно)
    Но на то и оффтоп)
  • Вопрос (16.04.08 23:21) [6]
    Сергей М, что есть ОБЭП ?

    и зачем там +0... :>
  • PEAKTOP © (16.04.08 23:45) [7]
    > а в чем смысл выражений ((TVR.Num+0) и ((DOC.Klient+0) ?
    зачем там 0 приплюсовывается ?


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

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

    В Firebird-е такой изврат позволяет в запросах явно рулить использованием индексов без статического указания плана, которое не есть кошерным в виду разного принципа работы оптимизаторов Firebird v1.5 и Firebird старше v2.0.
  • Вопрос (17.04.08 09:22) [8]
    SUM(TVR."Кол-во") AS QUANT - сейчас посмотрел, тут не то...

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

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

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

    тогда - Сount(TVR."Кол-во") AS QUANT , да ?
  • Вопрос (17.04.08 14:12) [9]
    ммм... а зачем DOC.Klient+0) = K.Klient если он и так делает группировку по K.Klient ? или я чего-то не понимаю...
  • Вопрос (17.04.08 14:21) [10]
    вообще по-моему, этот запрос не верный, PEAKTOP...

    тут надо что-то вроде JOIN наверное... а то у вас все условия прилагаются на все... и на дате где должно быть 200 клиентов оказываются 2... каким-то образом...
  • Вопрос (17.04.08 14:30) [11]
    а мож и нет.. :/
  • Вопрос (17.04.08 15:29) [12]
    не получается нифига, условия отсекают друг друга... и QUANT_DOC AS и QUANT оказывается равным друг другу... то есть количство документов - равным количеству товаров в этих документах... :/
  • Johnmen © (17.04.08 15:37) [13]
    Конкурс песни в медицинском институте:
    ...
    Песню: "Тихо сам с собою я веду беседу", - представила кафедра психиатрии.
    ...


    (c)
  • Вопрос (17.04.08 15:39) [14]
    Johnmen ©  ну раз никому сказать больше нечего-то
  • Вопрос (17.04.08 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 © (17.04.08 16:06) [16]
    Как насчет букваря по SQL?
  • Вопрос (17.04.08 16:08) [17]
    Johnmen © как насчет занятся ответами по делу ?
  • Вопрос (17.04.08 16:09) [18]
    для чего именно этот форум и существует.
  • sniknik © (17.04.08 16:13) [19]
    > для чего именно этот форум и существует.
    а мне нравится определение недавно прочитанное на sql.ru.

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

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

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

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

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

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

    Не обязательно, только не стоит обижаться на декартово произведение и дурной результат.
  • Вопрос (17.04.08 16:16) [21]
    sniknik как составить этот запрос ? Правильно.
  • Вопрос (17.04.08 16:17) [22]
    Anatoly Podgoretsky ©   (17.04.08 16:15) [20]

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

    Ваш запрос к сожалению не работает
  • Palladin © (17.04.08 16:18) [23]

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

    здорово, мне понравилось
    есть мысль... направлять всех сюда...
    http://pda.delphimaster.net/?id=1208434700&n=6
  • sniknik © (17.04.08 16:20) [24]
    > Как тогда объясняется это сообщение об ошибке ?
    можно отсутствием желания читать хелп

    вот тебе вариант с необязательным group
    SELECT Count(DOK.DOK) FROM DOK_ZAK_A1 DOK, S_KLIENT1 K;
    глупый (изза упомянутого декартового произведения) но рабочий
  • Вопрос (17.04.08 16:23) [25]
    sniknik © он не выводит все требуемые поля.
  • Вопрос (17.04.08 16:24) [26]
    хелп сейчас мне читать некогда просто. то есть я его читаю,
  • Вопрос (17.04.08 16:29) [27]
    Palladin © боюсь, что если я сейчас вот эту проблему не разрешу, в последующие лет 10 направлятся туда (или сюда) не будет никакой необходимости. :(
  • Вопрос (17.04.08 16:31) [28]
    помогите ж, блин :(
  • Anatoly Podgoretsky © (17.04.08 16:54) [29]
    > Вопрос  (17.04.2008 16:17:22)  [22]

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

    Такого сообщения ни разу не получал, даже и не знаю, что сказать.
  • Вопрос (17.04.08 16:58) [30]
    Anatoly Podgoretsky сорри, не ваш а Реактора. Работает не так как нужно
  • MsGuns © (17.04.08 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)
  • Вопрос (18.04.08 12:15) [32]
    MsGuns, я читал "основы". И простые запросы составлял.  

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

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

    Ну и дело осложнялось GROUP и аггрегирующими функциями...
    Вы б лучше готовый запрос дали, правильный - так легче было б разобратся.
 
Конференция "Начинающим" » Как составить сложный запрос ? [IB4.x, IB5.x, IB6.x, FireBird]
Есть новые Нет новых   [134434   +26][b:0][p:0.002]