powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите сделать вложенный запрос!
16 сообщений из 16, страница 1 из 1
помогите сделать вложенный запрос!
    #33372096
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть два отдельных запроса.
Первый (у меня он Запрос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].[Декады];

Как их объединить в один и есть ли в этом смысл (за и против)?
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33372198
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT
Format(LEG.dtmDATELEG,"mm") AS Месяцы, 
FormatDateForDecada(LEG.dtmDATELEG) AS Декады, 
Count(DET.chrCOMBINATION_SPECIES) As Кол_во
FROM trelLPTDET AS DET INNER JOIN trelLPTLEG LEG ON DET.lngNUMBER = LEG.lngNUMBER
WHERE LEG.dtmDATELEG Is Not Null
GROUP BY Format(LEG.dtmDATELEG,"mm"), FormatDateForDecada(LEG.dtmDATELEG)
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33374438
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, это не подходит. Отсутствует предикат DISTINCT и результаты запроса не те.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33374558
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cогласен. Ваши два запроса в итоге получют Кол-во уникальных hrCOMBINATION_SPECIES. Мой запрос просто подсчитывает записи по месяцам.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33374853
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Именно так! Но, может быть, я зря парюсь? И никаких плюсов от одного запроса вместо двух здесь нет? Но ведь интересно теоретически решить задачу...
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33374890
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура вашего запроса определяется необходимостью выполнить двух-уровневую группировку:
1) получить список уникальных значений chrCOMBINATION_SPECIES
2) посчитать количество этих уникальных значений

На мой взгляд, это реализуется лишь при помощи вложенного запроса - что у вас и сделано. Единственное, что можно предложить - просто объединить эти два запроса в один. Дополнительных плюсов от такого объединенного запроса вряд ли дождешься, разве что меньшее количество QueryDef в вашей базе. MS Jet все равно точно так же сначала выполнит вложенный запрос, потом сгруппирует его результат для внешнего SELECT.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33375491
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да-да, все именно так. Я понимаю, что выполняется сначала вложенный запрос. Меня другое интересует - как именно объединить эти два запроса в один? Вот чисто из спортивного интереса.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33375504
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да просто вместо имени первого запроса подставить его текст в скобках:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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 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 Месяцы, Декады;
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33380269
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
С какого перепугу?
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33380523
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КДвариант с единственным изменениемВ MS Jet SQL алиасы таблиц допускается писать через AS или просто через пробел.

КДвот эту странную конструкцию Access к запросу добавил самЭто запросто у них. MSA любит оптимизировать запросы, делая при этом сложные SQL плохо-читаемыми, отчего лично я предпочитаю вообще не пользоваться QueryDef для хранения текстов запросов.

КДПри попытке выполнить его запрашивается параметр
Запрос3.chrCOMBINATION_SPECIES. С какого перепугу?А точно - "его"? Может это была попытка выполнить не Запрос3_1, а запрос на его основе - в котором вы заменили "Запрос3" на "Запрос3_1" везде кроме Запрос3.chrCOMBINATION_SPECIES, например?
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33385270
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Это запросто у них. 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 год? Ну и уж совсем прекрасно, если бы за каждый год подводились итоги!
З.Ы. Хотел добавить "и чтоб все в шоколаде", но удержался.
З.З.Ы. Чем больше я на этом форуме тем больше у меня впечатление, что я тут самый м-м-м... неумный. Задолбал всех своими дурацкими вопросами.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33385450
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КДА как лучше хранить тексты запросов?Да вобщем-то дело вкуса, ну и смотря чем приложение занимается. Мне для моих целей удобнее хранить тексты используемых запросов в таблицах.

КДв Запросе3 был DISTINCT. В объединенном его нет, тем не менее, результаты те же. Как так?DISTINCT обеспечивает в результате уникальный набор значений для группы перечисленных в нем полей. В вашем запросе DISTINCT был по трем полям - по тем же самым, что и GROUP BY. То есть, уникальность наборов значений в этих полях обеспечиволась группировкой, и DISTICT в этом случае просто лишний.

КДА можно как-н. вывести в одной таблице "Месяцы", "Декады", "Кол_во_дней_сбора", "Кол_видов"?
Ну просто повяжите эти два запроса по их уникальным полям (месяцам и декадам). Целиком не пишу, чтоб суть была читаема:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT 
 A.Месяцы,  A.Декады,  A.Кол_во_видов,  B.Кол_во_дней_сбора
FROM
 (тут весь запрос из вашего поста где Кол_во_видов) AS A,
 (тут весь запрос из вашего поста где Кол_во_дней_сбора) AS B,
WHERE 
 A.Месяцы=B.Месяцы AND A.Декады=B.Декады

Удачи.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33385485
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КДНо выводится кол-во повторов (1, 2, 3 и т.д.) каждого имени в годуТак это выводится Count() как вы написали. Если хотите - проверьте его и пишите всегда 1 если он не =0.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TRANSFORM IIf(Nz(Count(*), 0 )= 0 ,"","1") AS Значение
SELECT A.chrCOMBINATION_SPECIES
FROM 
   (SELECT chrCOMBINATION_SPECIES, Min(dtmDATELEG) AS Min_DATE
   FROM trelLPTDET INNER JOIN trelLPTLEG 
   ON trelLPTDET.lngNUMBER = trelLPTLEG.lngNUMBER
   GROUP BY chrCOMBINATION_SPECIES) AS A
GROUP BY A.chrCOMBINATION_SPECIES
PIVOT Format(A.Min_DATE,"yyyy") In (
"1987","1988","1989","1990","1991",
"1992","1993","1994","1995","1996",
"1997","1998","1999","2000","2001",
"2002","2003","2004","2005","Итоговое значение");

КДНу и уж совсем прекрасно, если бы за каждый год подводились итогиВ том же запросе - это вряд-ли. Однако, если вы будете на этом запросе строить отчет, то такое суммирование довольно просто сделать прямо в отчете.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #33387681
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОГРОМНОЕ СПАСИБО, ВСЕ РАБОТАЕТ!
По поводу хранения текстов запросов - "смотря чем приложение занимается"?
Настольная такая маленькая mdb-ка, "курирует" коллекцию. Соответственно внесенение данных об объектах и получение интересующей информации.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
помогите сделать вложенный запрос!
    #34312343
wap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wap
Гость
А мне тоже немного подскажите, пожалуйста

Есть запрос 1 (промежуточный):

SELECT Планы.Год, Планы.Месяц, Планы.Менеджер, Планы.[Код товара БЭСТ], Планы.[Наименование товара], Планы.[План, кг], [Год] & [Месяц] AS ГодМесяц
FROM Планы
GROUP BY Планы.Год, Планы.Месяц, Планы.Менеджер, Планы.[Код товара БЭСТ], Планы.[Наименование товара], Планы.[План, кг], [Год] & [Месяц];

Запрос 2 (нужный):
SELECT Планы1.Год, Планы1.Месяц, Планы1.Менеджер, Планы1.[Код товара БЭСТ], Планы1.[Наименование товара], Планы1.[План, кг], Планы1.ГодМесяц, Календарь.Дней, Календарь.Выходных
FROM Планы1 LEFT JOIN Календарь ON Планы1.ГодМесяц = Календарь.ГодМесяц;


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

Фактически что делается:
Есть таблица с планами (Планы), в них есть год и месяц, которые я сцепляю (получая строку ГодМесяц) в первом запросе (Планы1), во втором запросе (Планы2) по ГодМесяц приливаются данные о количестве дней в месяце и выходных.
...
Рейтинг: 0 / 0
помогите сделать вложенный запрос!
    #34312458
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wapСамый простой для меня способ, который черпнул из топика: вместо названий второго запроса вписать текст первого, но тогда будет текст огромный и нечитаемыйНе надо подставлять вместо ВСЕХ названий "Планы1" его SQL - а только вместо одного (того, который во FROM):
SELECT Планы1.Год, Планы1.Месяц, Планы1.Менеджер, Планы1.[Код товара БЭСТ], Планы1.[Наименование товара], Планы1.[План, кг], Планы1.ГодМесяц, Календарь.Дней, Календарь.Выходных
FROM
(SELECT Год, Месяц, Менеджер, [Код товара БЭСТ], [Наименование товара], [План, кг], [Год] & [Месяц] AS ГодМесяц FROM Планы
GROUP BY Год, Месяц, Менеджер, [Код товара БЭСТ], [Наименование товара], [План, кг], [Год] & [Месяц]) AS Планы1
LEFT JOIN Календарь ON Планы1.ГодМесяц = Календарь.ГодМесяц;
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / помогите сделать вложенный запрос!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]