Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
1

Работа First и Last в запросе

03.10.2017, 16:56. Просмотров 704. Ответов 21
Метки нет (Все метки)

Есть запрос по отделениям клиники, где даты задаются от [начала периода] до [конца периода].
В запросе, помимо всего остального, две графы: "На начало периода" - сколько человек находилось в отделении на [начало периода] и "На конец периода" - сколько человек находится в отделении в [конце периода].
Использовала для "На начало периода" функцию First, "На конец периода" соответственно Last.
Функции эти выдают не то, что нужно - First вместо первой записи, датированной началом периода, выдает первую запись таблицы вообще. С функцией Last аналогично - не запись конца периода, а последнюю запись вообще

Как прописать условие в запросе, чтобы выдавалось то, что надо?

В приложенной таблице это графа "на начало суток" и "на конец суток"
0
Миниатюры
Работа First и Last в запросе  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2017, 16:56
Ответы с готовыми решениями:

Работа с датами в запросе (1С 8.1)
Здравствуйте, дамы и господа ! Я сам программист (Delphi, VB) со стажем, но за...

Работа с датой в запросе sql
Вот такой запрос: Form1->ADOQuery1->SQL->Text="INSERT INTO Table1(Код, )...

C# + Access работа с датами в запросе
Доброго времени суток господа! столкнулся с проблемой передачи даты как...

Работа с датами в sql запросе
Добрый день. Имеется такой запрос: string sql = "SELECT type_repair,...

Не корректная работа оператора ORDER BY запросе
Доброго всем времени суток. Запускаю на выполнение запрос 'INSERT INTO...

21
ltv_1953
Эксперт MS Access
12872 / 5842 / 1127
Регистрация: 21.06.2012
Сообщений: 10,523
03.10.2017, 18:43 2
Из справки
"Функции First, Last
Возвращают значение поля из первой или последней записи результирующего набора запроса.

Синтаксис
First(выражение)

Last(выражение)

Аргумент выражение является строковым выражением, которое определяет поле, содержащее данные для подсчета, или выражение, выполняющее вычисления с данными из этого поля. Операнды аргумента выражение могут включать имя поля таблицы, константу или функцию. (Функция может быть внутренней или определяться пользователем, но не может быть другой статистической функцией SQL).

Дополнительные сведения
Функции First и Last могут рассматриваться как аналоги методов MoveFirst и MoveLast объекта доступа к данным (DAO) Recordset. Они возвращают значение указанного поля, находящееся соответственно в первой или последней записях результирующего набора запроса. Поскольку записи обычно возвращаются без какого-либо специального порядка (кроме случаев, когда запрос содержит предложение ORDER BY), эти функции возвращают случайные записи."

Используйте Min и Max.
0
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
03.10.2017, 19:58  [ТС] 3
Извините, мне не нужно Min и Max.
Мне нужна первая цифра и последняя.

Добавлено через 5 минут
Цитата Сообщение от ltv_1953 Посмотреть сообщение
Из справки
"Функции First, Last
Возвращают значение поля из первой или последней записи результирующего набора запроса.
Спасибо, читать документацию я умею.
Но если бы это было так, то я не писала бы в форуме. Работало бы то, что я указала в запросе. Но, увы, не работает!
0
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
03.10.2017, 20:17 4
IRKIS,

Таблицу лучше исходную покажите, какие там поля.
Что толку на запрос смотреть, да еще в конструкторе?
Ни First, ни Last Вам не нужны.
А что нужно, зависит от структуры исходной таблицы.
Может, Sum.
Может, DCount.
Может, еще что.

Уметь читать документацию мало, хорошо бы еще понимать.)))
0
Вячеслав Я
Эксперт MS Access
2804 / 1349 / 212
Регистрация: 13.05.2011
Сообщений: 4,107
03.10.2017, 20:27 5
Цитата Сообщение от IRKIS Посмотреть сообщение
Но, увы, не работает!
Таким методом как у Вас и не заработает, т.к. уважаемый ltv_1953, Вам про это сказал
Цитата Сообщение от IRKIS Посмотреть сообщение
Возвращают значение поля из первой или последней записи результирующего набора запроса.
т.е. в одном поле записи не возможно показать и первое и последнее одновременно.
Но можно попробовать в запрос вставить вычисляемое поле для начала месяца
SQL
1
1: SUM(IIf(DAY([Дата])=1;[Sum-ВашеПолеСПациентами];NULL))
и конца месяца
SQL
1
1: SUM(IIf(DAY([Дата])=31;[Sum-ВашеПолеСПациентами];NULL))
В них будет подсчет пациентов на эти дни.
Аналогично можно для каждого дня. Тогда будете знать динамику.
Но надо конечно еще знать как у Вас пациенты по палатам или нет (хотя это и не важно).
Данные запросы должны сработать.

Поле ВашеПолеСПациентами - условное название (числовое с тем как вы ведете учет). Как вы его ведете?

Добавлено через 8 минут
Цитата Сообщение от Вячеслав Я Посмотреть сообщение
и конца месяца

1: SUM(IIf(DAY([Дата])=31;[Sum-ВашеПолеСПациентами];NULL))
Тут в начале надо писать 31 (это дата месяца): т.е. так
SQL
1
31: SUM(IIf(DAY([Дата])=31;[Sum-ВашеПолеСПациентами];NULL))
0
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
03.10.2017, 20:56  [ТС] 6
Моя таблица.
Мне надо, чтобы в поле на запрос с 1 по 3 октября 2017 года "На начало периода" и "На конец периода" стояло
для 1 госпитального 22 (1 октября на начало суток) и 24 (3 октября на конец суток) соответственно
для 1 хирургии 49 и 47
для 2 хирургии 55 и 57
для 3 хирургии 50 и 61
и т.д.
0
Миниатюры
Работа First и Last в запросе  
mobile
Эксперт MS Access
23030 / 13075 / 2723
Регистрация: 28.04.2012
Сообщений: 14,319
03.10.2017, 21:57 7
Вот такой запрос покажет количества на начало и конец периода
SQL
1
2
3
4
5
6
7
8
9
10
SELECT Отделение, SUM(z.[на начало суток]) AS [На начало периода], SUM(z.[на конец суток]) AS [На конец периода]
FROM
(SELECT Отделение, [на начало суток], 0 AS [на конец суток]
FROM Таблица
WHERE Дата=[Дата начала периода]
UNION ALL
SELECT Отделение, 0, [на конец суток]
FROM Таблица
WHERE Дата=[Дата конца периода]) AS z
GROUP BY Отделение
2
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
04.10.2017, 09:09 8
IRKIS,

SQL
1
2
3
4
5
6
7
8
9
10
SELECT Отделение, ....все прочие суммы.... ,
       (SELECT НаНачалоСуток 
        FROM Движение 
        WHERE Отделение=T.Отделение AND Дата=ДатаНачалаПериода) AS НаНачалоПериода,
       (SELECT НаКонецСуток 
        FROM Движение 
        WHERE Отделение=T.Отделение AND Дата=ДатаОкончанияПериода) AS НаКонецПериода
FROM Движение AS T
WHERE Дата BETWEEN .......
GROUP BY Отделение
В Вашем запросе еще есть группировка по Числу коек.
Не знаю, зачем.
Поэтому здесь этого нет.
1
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
04.10.2017, 12:27  [ТС] 9
Цитата Сообщение от Capi Посмотреть сообщение
В Вашем запросе еще есть группировка по Числу коек.
Не знаю, зачем.
Поэтому здесь этого нет.
Вы правы, группировка по числу коек не нужна.
Запрос с итогами, но койки суммировать не нужно, просто отразить.
Я не нашла что поставить для количества коек в групповой операции. Потому поставила "группировка".

Количество коек нужно просуммировать в промежуточных группах в отчете. Группа "Итого по хирургии" со всеми суммами, "Итого по травме" и т.д.
0
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
04.10.2017, 12:33 10
IRKIS,

С койками потом разберетесь.
К тому же только Вам известно, где и как хранятся эти сведения.

А что по поводу основного вопроса темы?
Поняли, как делать?
1
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
04.10.2017, 12:44  [ТС] 11
Да, поняла, спасибо.
Но там мне надо разбираться мне на ощупь, так как в SQL никогда не правила. А там такая каша!

SQL
1
2
3
4
SELECT Движение.Отделение, [Коды отделений].[Количество коек], FIRST(Движение.[На начало суток]) AS [First-На начало суток], SUM(Движение.[Поступило всего]) AS [Sum-Поступило всего], SUM(Движение.[Сельских жителей]) AS [Sum-Сельских жителей], SUM(Движение.[до 17 лет]) AS [Sum-до 17 лет], SUM(Движение.[от 60 и старше]) AS [Sum-от 60 и старше], SUM(Движение.[Перевод из других отделений]) AS [Sum-Перевод из других отделений], SUM(Движение.[Перевод в другие отделения]) AS [Sum-Перевод в другие отделения], SUM(Движение.Умерло) AS [Sum-Умерло], LAST(Движение.[На конец суток]) AS [Last-На конец суток], DateDiff("d",[Начало периода],[Конец периода],2) AS Период, Round([Койко-дни]/[Период],2) AS [Средний загруз в день], SUM(Движение.[На конец суток]) AS [Койко-дни], [Количество коек]-[Средний загруз в день] AS Перегруз, Round([Койко-дни]/[Количество коек]/[Период]*100,2) AS [Проц исп коечн фонда], [Коды отделений].Профиль
FROM Движение INNER JOIN [Коды отделений] ON Движение.Отделение = [Коды отделений].Наименование
WHERE (((Движение.Дата) BETWEEN [Начало периода] AND [Конец периода]))
GROUP BY Движение.Отделение, [Коды отделений].[Количество коек], [Коды отделений].Профиль;
Добавлено через 2 минуты
Я все хочу оставить, кроме
First(Движение.[На начало суток]) AS [First-На начало суток] и
Last(Движение.[На конец суток]) AS [Last-На конец суток]

Вместо этого вставляю вашу правку? Верно?
0
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
04.10.2017, 13:32 12
Цитата Сообщение от IRKIS Посмотреть сообщение
А там такая каша!
Вот так каши поменьше:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
Движение.Отделение, 
[Коды отделений].[Количество коек], 
FIRST(Движение.[На начало суток]) AS [First-На начало суток], 
SUM(Движение.[Поступило всего]) AS [Sum-Поступило всего], 
SUM(Движение.[Сельских жителей]) AS [Sum-Сельских жителей], 
SUM(Движение.[до 17 лет]) AS [Sum-до 17 лет], 
SUM(Движение.[от 60 и старше]) AS [Sum-от 60 и старше], 
SUM(Движение.[Перевод из других отделений]) AS [Sum-Перевод из других отделений], 
SUM(Движение.[Перевод в другие отделения]) AS [Sum-Перевод в другие отделения], 
SUM(Движение.Умерло) AS [Sum-Умерло], 
LAST(Движение.[На конец суток]) AS [Last-На конец суток], 
DateDiff("d",[Начало периода],[Конец периода],2) AS Период, 
Round([Койко-дни]/[Период],2) AS [Средний загруз в день], 
SUM(Движение.[На конец суток]) AS [Койко-дни], 
[Количество коек]-[Средний загруз в день] AS Перегруз, 
Round([Койко-дни]/[Количество коек]/[Период]*100,2) AS [Проц исп коечн фонда], 
[Коды отделений].Профиль
FROM Движение INNER JOIN [Коды отделений] ON Движение.Отделение = [Коды отделений].Наименование
WHERE (((Движение.Дата) BETWEEN [Начало периода] AND [Конец периода]))
GROUP BY Движение.Отделение, [Коды отделений].[Количество коек], [Коды отделений].Профиль
Цитата Сообщение от IRKIS Посмотреть сообщение
Я все хочу оставить, кроме
First(Движение.[На начало суток]) AS [First-На начало суток] и
Last(Движение.[На конец суток]) AS [Last-На конец суток]
Вместо этого вставляю вашу правку? Верно?
В принципе, пока да.
Только обратите внимание на псевдоним таблицы Движение.
1
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
04.10.2017, 16:52  [ТС] 13
Capi,
Спасибо!!!
Я разобралась таки
Заработало!!!

0
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
04.10.2017, 17:16 14
IRKIS,

Вот и хорошо!
Только не надо так головой об стенку биться,))) ведь пригодится еще (имею в виду стенку).)))
1
Вячеслав Я
Эксперт MS Access
2804 / 1349 / 212
Регистрация: 13.05.2011
Сообщений: 4,107
04.10.2017, 17:21 15
IRKIS, для справки:
Если хотите кому-либо сказать Спасибо, то можно ещё нажать кнопочку с плюсом. Таким образом вы запишите один балл в копилку отвечающему (это по правилам форума).
2
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
04.10.2017, 17:28  [ТС] 16
Вячеслав Я, спасибо, буду знать теперь. Я еще новичок на форуме. Нажала плюсик.

Цитата Сообщение от Capi Посмотреть сообщение
ведь пригодится еще (имею в виду стенку).)))
Ну, естественно, не моя голова

С синтаксисом боролась. Квадратные скобки, круглые, запятые, точки... Вот это и было битье об стену.
0
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
04.10.2017, 17:34 17
IRKIS,

Восхитительно!)))
"Нажала плюсик"...
Что-то не вижу....
Все равно кому, да?
2
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
04.10.2017, 17:49  [ТС] 18
Вам нажала. Не видно разве?

Добавлено через 38 секунд
И не один раз.
1
Capi
Модератор
Эксперт MS Access
1755 / 935 / 190
Регистрация: 12.06.2016
Сообщений: 2,069
04.10.2017, 18:02 19
IRKIS,

Вот теперь вижу - совсем другое дело.)))

Вам тоже нажала плюсик за освоение запросов.)))
1
IRKIS
97 / 3 / 0
Регистрация: 19.09.2016
Сообщений: 36
05.10.2017, 08:02  [ТС] 20
Capi, извините, еще вопрос. Забыла вчера на радостях спросить.

А зачем понадобился псевдоним таблицы?
0
05.10.2017, 08:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2017, 08:02

Работа с двумя базами и объединене их в запросе
Всем доброго дня, помогите разобраться пожалуйста. Есть 2 БД, 1 БД - Access, 2...

Работа с DataGridView. Подскажите где косяк при запросе
Здравствуйте. Беда! Подскажите где косяк при запросе к бд private...

Работа с массивом, полученным при запросе mysql_fetch_array($result)
Здравствуйте! Подскажите пожалуйста, как работать с такими массивами ( найти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru