|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Есть два отдельных запроса. Первый (у меня он Запрос3): SELECT DISTINCT Format([trelLPTLEG.dtmDATELEG],"mm") AS Месяцы, FormatDateForDecada(trelLPTLEG.[dtmDATELEG]) AS Декады, trelLPTDET.chrCOMBINATION_SPECIES FROM trelLPTDET INNER JOIN trelLPTLEG ON trelLPTDET.lngNUMBER = trelLPTLEG.lngNUMBER WHERE ((([trelLPTLEG].[dtmDATELEG]) Is Not Null)) GROUP BY Format(trelLPTLEG.dtmDATELEG,"mm"), FormatDateForDecada(trelLPTLEG.dtmDATELEG), trelLPTDET.chrCOMBINATION_SPECIES; Второй: SELECT [Запрос3].[Месяцы], [Запрос3].[Декады], Count(Запрос3.chrCOMBINATION_SPECIES) AS Кол_во FROM Запрос3 GROUP BY [Запрос3].[Месяцы], [Запрос3].[Декады]; Как их объединить в один и есть ли в этом смысл (за и против)? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2005, 18:18 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Ну как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2005, 19:23 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Нет, это не подходит. Отсутствует предикат DISTINCT и результаты запроса не те. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2005, 18:19 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Cогласен. Ваши два запроса в итоге получют Кол-во уникальных hrCOMBINATION_SPECIES. Мой запрос просто подсчитывает записи по месяцам. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2005, 19:27 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Именно так! Но, может быть, я зря парюсь? И никаких плюсов от одного запроса вместо двух здесь нет? Но ведь интересно теоретически решить задачу... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2005, 07:35 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Структура вашего запроса определяется необходимостью выполнить двух-уровневую группировку: 1) получить список уникальных значений chrCOMBINATION_SPECIES 2) посчитать количество этих уникальных значений На мой взгляд, это реализуется лишь при помощи вложенного запроса - что у вас и сделано. Единственное, что можно предложить - просто объединить эти два запроса в один. Дополнительных плюсов от такого объединенного запроса вряд ли дождешься, разве что меньшее количество QueryDef в вашей базе. MS Jet все равно точно так же сначала выполнит вложенный запрос, потом сгруппирует его результат для внешнего SELECT. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2005, 10:32 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Да-да, все именно так. Я понимаю, что выполняется сначала вложенный запрос. Меня другое интересует - как именно объединить эти два запроса в один? Вот чисто из спортивного интереса. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2005, 18:06 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Да просто вместо имени первого запроса подставить его текст в скобках: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2005, 18:39 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
Karfagen, спасибо! Запрос работает. Я попробовал предложенный вариант с единственным изменением SELECT Месяцы, Декады, Count(*) AS Кол_во FROM (SELECT Format(LEG.dtmDATELEG,"mm") AS Месяцы, FormatDateForDecada(LEG.dtmDATELEG) AS Декады, DET.chrCOMBINATION_SPECIES As SPECIES FROM trelLPTDET AS DET INNER JOIN trelLPTLEG AS LEG ON DET.lngNUMBER = LEG.lngNUMBER WHERE LEG.dtmDATELEG Is Not Null GROUP BY Format(LEG.dtmDATELEG,"mm"), FormatDateForDecada(LEG.dtmDATELEG), DET.chrCOMBINATION_SPECIES) GROUP BY Месяцы, Декады; После выполнения еще раз взглянул на запрос в режиме SQL, а там SELECT Месяцы, Декады, Count(*) AS Кол_во FROM [SELECT Format(LEG.dtmDATELEG,"mm") AS Месяцы, FormatDateForDecada(LEG.dtmDATELEG) AS Декады, DET.chrCOMBINATION_SPECIES AS SPECIES FROM trelLPTDET AS DET INNER JOIN trelLPTLEG AS LEG ON DET.lngNUMBER = LEG.lngNUMBER WHERE LEG.dtmDATELEG Is Not Null GROUP BY Format(LEG.dtmDATELEG,"mm"), FormatDateForDecada(LEG.dtmDATELEG), DET.chrCOMBINATION_SPECIES]. AS [%$##@_Alias] GROUP BY Месяцы, Декады; вот эту странную конструкцию Access к запросу добавил сам. Почему? М.б. надо было тут что-н. осмысленное написать самому? Еще одна интересная штука Взял Запрос3 (см. мой первый пост), скопировал и вставил под другим (Запрос3_1) именем. В нем кое-что поменял SELECT DISTINCT Format([trelLPTLEG.dtmDATELEG],"mm") AS Месяцы, FormatDateForDecada(trelLPTLEG.[dtmDATELEG]) AS Декады, trelLPTLEG.dtmDATELEG AS Кол_во_дат_сбора FROM trelLPTDET INNER JOIN trelLPTLEG ON trelLPTDET.lngNUMBER = trelLPTLEG.lngNUMBER WHERE ((([trelLPTLEG].[dtmDATELEG]) Is Not Null)) GROUP BY Format(trelLPTLEG.dtmDATELEG,"mm"), FormatDateForDecada(trelLPTLEG.dtmDATELEG), trelLPTLEG.dtmDATELEG; При попытке выполнить его запрашивается параметр Запрос3.chrCOMBINATION_SPECIES С какого перепугу? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2005, 01:07 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
КДвариант с единственным изменениемВ MS Jet SQL алиасы таблиц допускается писать через AS или просто через пробел. КДвот эту странную конструкцию Access к запросу добавил самЭто запросто у них. MSA любит оптимизировать запросы, делая при этом сложные SQL плохо-читаемыми, отчего лично я предпочитаю вообще не пользоваться QueryDef для хранения текстов запросов. КДПри попытке выполнить его запрашивается параметр Запрос3.chrCOMBINATION_SPECIES. С какого перепугу?А точно - "его"? Может это была попытка выполнить не Запрос3_1, а запрос на его основе - в котором вы заменили "Запрос3" на "Запрос3_1" везде кроме Запрос3.chrCOMBINATION_SPECIES, например? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2005, 09:42 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
>Это запросто у них. MSA любит оптимизировать запросы, делая при этом сложные SQL плохо-читаемыми, отчего лично я предпочитаю вообще не пользоваться QueryDef для хранения текстов запросов. А как лучше хранить тексты запросов? >А точно - "его"? Может это была попытка выполнить не Запрос3_1, а запрос на его основе - в котором вы заменили "Запрос3" на "Запрос3_1" везде кроме Запрос3.chrCOMBINATION_SPECIES, например? Нет, именно ЕГО. И не было там "Запрос3.chrCOMBINATION_SPECIES". Выкрутился я так: скопировал текст глючного запроса, затем убил его, создал новый, вставил туда скопированный текст. Все заработало как надо! Вывод - глюк! Вот кстати по поводу процедуры вложения запросов. Ведь в варианте, когда существуют два разных, в Запросе3 был DISTINCT. В объединенном его нет, тем не менее, результаты те же. Как так? Похоже, мне надо поглубже вникнуть в теорию, если можно ссылку на какой-н. "исчерпывающий" топик... Так что после этих шаманств я приведенного примера почти скопировал запрос, кое-что изменив, чтобы получить кол-во дней сбора с разбивкой по декадам: SELECT Месяцы, Декады, Count(*) AS Кол_во_дней_сбора FROM [SELECT Format(LEG.dtmDATELEG,"mm") AS Месяцы, FormatDateForDecada(LEG.dtmDATELEG) AS Декады, LEG.dtmDATELEG AS Даты FROM trelLPTDET AS DET INNER JOIN trelLPTLEG AS LEG ON DET.lngNUMBER = LEG.lngNUMBER WHERE LEG.dtmDATELEG Is Not Null GROUP BY Format(LEG.dtmDATELEG,"mm"), FormatDateForDecada(LEG.dtmDATELEG), LEG.dtmDATELEG]. AS [%$##@_Alias] GROUP BY Месяцы, Декады; Плюс запрос, любезно предоставленный Вами: SELECT Месяцы, Декады, Count(*) AS Кол_во_видов FROM [SELECT Format(LEG.dtmDATELEG,"mm") AS Месяцы, FormatDateForDecada(LEG.dtmDATELEG) AS Декады, DET.chrCOMBINATION_SPECIES AS SPECIES FROM trelLPTDET AS DET INNER JOIN trelLPTLEG AS LEG ON DET.lngNUMBER = LEG.lngNUMBER WHERE LEG.dtmDATELEG Is Not Null GROUP BY Format(LEG.dtmDATELEG,"mm"), FormatDateForDecada(LEG.dtmDATELEG), DET.chrCOMBINATION_SPECIES]. AS [%$##@_Alias] GROUP BY Месяцы, Декады; А можно как-н. вывести в одной таблице "Месяцы", "Декады", "Кол_во_дней_сбора", "Кол_видов"? И еще (раз уж пошла такая пьянка). Я на форуме как-то задавал вопрос про перекрестный запрос и даже вроде бы получил ответы, но реализовать что-то никак не получается. Вот такая конструкция TRANSFORM Count(trelLPTLEG.lngNUMBER) AS Значение SELECT trelLPTDET.chrCOMBINATION_SPECIES FROM trelLPTDET INNER JOIN trelLPTLEG ON trelLPTDET.lngNUMBER = trelLPTLEG.lngNUMBER GROUP BY trelLPTDET.chrCOMBINATION_SPECIES PIVOT Format(trelLPTLEG.dtmDATELEG,"yyyy") In ("1987","1988","1989","1990","1991","1992","1993","1994","1995","1996","1997","1998","1999","2000","2001","2002","2003","2004","2005","Итоговое значение"); Но выводится кол-во повторов (1, 2, 3 и т.д.) каждого имени в году. А надо бы, чтобы учитывалось только было (1) в этом году или нет (пусто). А еще лучше, если бы учитывалось только первое по времени вхождение любого имени в таблицу? Т.е. если Васи были съедены в 1989, 1990, 1991 и т.д. годах, то считалась бы только "1" за 1989 год? Ну и уж совсем прекрасно, если бы за каждый год подводились итоги! З.Ы. Хотел добавить "и чтоб все в шоколаде", но удержался. З.З.Ы. Чем больше я на этом форуме тем больше у меня впечатление, что я тут самый м-м-м... неумный. Задолбал всех своими дурацкими вопросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2005, 19:41 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
КДА как лучше хранить тексты запросов?Да вобщем-то дело вкуса, ну и смотря чем приложение занимается. Мне для моих целей удобнее хранить тексты используемых запросов в таблицах. КДв Запросе3 был DISTINCT. В объединенном его нет, тем не менее, результаты те же. Как так?DISTINCT обеспечивает в результате уникальный набор значений для группы перечисленных в нем полей. В вашем запросе DISTINCT был по трем полям - по тем же самым, что и GROUP BY. То есть, уникальность наборов значений в этих полях обеспечиволась группировкой, и DISTICT в этом случае просто лишний. КДА можно как-н. вывести в одной таблице "Месяцы", "Декады", "Кол_во_дней_сбора", "Кол_видов"? Ну просто повяжите эти два запроса по их уникальным полям (месяцам и декадам). Целиком не пишу, чтоб суть была читаема: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2005, 21:36 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
КДНо выводится кол-во повторов (1, 2, 3 и т.д.) каждого имени в годуТак это выводится Count() как вы написали. Если хотите - проверьте его и пишите всегда 1 если он не =0. КДбы учитывалось только первое по времени вхождение любого имени в таблицуЕсли "первое по времени" - это минимальная дата, то сделать вложенный запрос с группировкой по имени, а минимальная дата будет Min(dtmDATELEG). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
КДНу и уж совсем прекрасно, если бы за каждый год подводились итогиВ том же запросе - это вряд-ли. Однако, если вы будете на этом запросе строить отчет, то такое суммирование довольно просто сделать прямо в отчете. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2005, 22:25 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
ОГРОМНОЕ СПАСИБО, ВСЕ РАБОТАЕТ! По поводу хранения текстов запросов - "смотря чем приложение занимается"? Настольная такая маленькая mdb-ка, "курирует" коллекцию. Соответственно внесенение данных об объектах и получение интересующей информации. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2005, 18:35 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
А мне тоже немного подскажите, пожалуйста Есть запрос 1 (промежуточный): SELECT Планы.Год, Планы.Месяц, Планы.Менеджер, Планы.[Код товара БЭСТ], Планы.[Наименование товара], Планы.[План, кг], [Год] & [Месяц] AS ГодМесяц FROM Планы GROUP BY Планы.Год, Планы.Месяц, Планы.Менеджер, Планы.[Код товара БЭСТ], Планы.[Наименование товара], Планы.[План, кг], [Год] & [Месяц]; Запрос 2 (нужный): SELECT Планы1.Год, Планы1.Месяц, Планы1.Менеджер, Планы1.[Код товара БЭСТ], Планы1.[Наименование товара], Планы1.[План, кг], Планы1.ГодМесяц, Календарь.Дней, Календарь.Выходных FROM Планы1 LEFT JOIN Календарь ON Планы1.ГодМесяц = Календарь.ГодМесяц; Самый простой для меня способ, который черпнул из топика: вместо названий второго запроса вписать текст первого, но тогда будет текст огромный и нечитаемый, и возможно запрос будет выполняться несколько раз? Фактически что делается: Есть таблица с планами (Планы), в них есть год и месяц, которые я сцепляю (получая строку ГодМесяц) в первом запросе (Планы1), во втором запросе (Планы2) по ГодМесяц приливаются данные о количестве дней в месяце и выходных. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2007, 13:11 |
|
помогите сделать вложенный запрос!
|
|||
---|---|---|---|
#18+
wapСамый простой для меня способ, который черпнул из топика: вместо названий второго запроса вписать текст первого, но тогда будет текст огромный и нечитаемыйНе надо подставлять вместо ВСЕХ названий "Планы1" его SQL - а только вместо одного (того, который во FROM): SELECT Планы1.Год, Планы1.Месяц, Планы1.Менеджер, Планы1.[Код товара БЭСТ], Планы1.[Наименование товара], Планы1.[План, кг], Планы1.ГодМесяц, Календарь.Дней, Календарь.Выходных FROM (SELECT Год, Месяц, Менеджер, [Код товара БЭСТ], [Наименование товара], [План, кг], [Год] & [Месяц] AS ГодМесяц FROM Планы GROUP BY Год, Месяц, Менеджер, [Код товара БЭСТ], [Наименование товара], [План, кг], [Год] & [Месяц]) AS Планы1 LEFT JOIN Календарь ON Планы1.ГодМесяц = Календарь.ГодМесяц; ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2007, 13:35 |
|
|
start [/forum/topic.php?fid=45&gotonew=1&tid=1652981]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
13ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 438ms |
0 / 0 |