Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД / 25 сообщений из 54, страница 1 из 3
07.03.2016, 13:05
    #39187129
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Имеется таблица Таблица1:
Событие Дата рТ рССобытие1 01.01.2016 "" ""Событие1 05.01.2016 4 4Событие2 06.01.2016 "" ""Событие1 07.01.2016 2 3
Где рТ - Текущая разница с последней датой для данного события, дней
рС - средняя разница по всем рТ не равным ""(необязательное условие, можно и ноль добавить, правда среднее для второго события сократится вдвое, но на дистанции выравняется) для данного события, дней

При добавлении новой записи, нужно посчитать разницу с последней(наибольшей) датой для данного события - записать полученное значение в рТ и посчитать среднее для всех рТ по добавляемому событию и записать значение в рС.
Подскажите где ошибка?:
Код: vbnet
1.
SqlCom = New OleDbCommand("INSERT into Таблица1(Событие, Дата, рТ, рС) values('" & TextBox1.Text & "', '" & DateTimePicker1.Value.Date & "', '" & DateDiff("d", Max(Дата), Date()) &"', '" & Avg(рТ) & "' WHERE Событие = '" & TextBox1.Text & "'", Con)
...
Рейтинг: 0 / 0
07.03.2016, 14:59
    #39187181
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Небольшое уточнение:
Событие - текстовый, Дата - Дата\Время, рС и рТ - Числовые. Двойными кавычками я пытался изобразить пустое поле) но можно заменить нулем.
Работа программы будет выглядеть следующим образом. На форме есть поля для добавления записей. Программа при старте должна делать прогноз - то есть, по прошествии с события дней больше чем рС, делать уведомление.
Если не делать запись значений рС, рТ в бд, то должно получится что-то типо такого:
Код: vbnet
1.
"Select * from Таблица1 where DateDiff(с последнего) > DateDiff(среднее)"


Сложность, для меня, в задании параметров для DateDiff.
Буду рад любой помощи.
...
Рейтинг: 0 / 0
07.03.2016, 15:00
    #39187182
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win,
Вычисления в таблицах - неправильно. рТ и рС-есть излишествующие данные
Вычисления проводятся в запросах (с параметрами-в данном случае, [введите дату] на которую хотите получить данные, это параметр)
как-то так:
Код: vbnet
1.
2.
3.
4.
PARAMETERS[введите дату] DateTime;
SELECT Таблица1.событие, DCount("событие","таблица1","дата<=#" & Format([введите дату],"mm\/dd\/yyyy") & "# and событие='" & [событие] & "'") AS Выражение1
FROM Таблица1
GROUP BY Таблица1.событие;
...
Рейтинг: 0 / 0
07.03.2016, 15:23
    #39187189
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Код: sql
1.
2.
3.
4.
5.
SELECT Таблица1.*, DateDiff("d", Таблица1.Дата, Date()) AS DD, Q.AvgAvg
FROM Таблица1 INNER JOIN 
(SELECT PDKey, Avg(DateDiff("d", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Таблица1.Событие) AS Q 
ON Таблица1.Событие = Q.Событие
WHERE (((DateDiff("d", Таблица1.Дата, Date())) > Q.AvgAvg));
...
Рейтинг: 0 / 0
07.03.2016, 15:34
    #39187196
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_winпо всем рТ не равным ""В результате чего рТ = "" ?
...
Рейтинг: 0 / 0
07.03.2016, 15:38
    #39187199
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelle,
При добавлении в таблицу рТ будет равняться 0 дней. Не хотел ставить 0 потому что при второй дате, скажем с интервалом 10 дней, среднее значение будет равно 5, хотя по факту 10.
...
Рейтинг: 0 / 0
07.03.2016, 15:43
    #39187202
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.
...
Рейтинг: 0 / 0
07.03.2016, 17:24
    #39187255
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelleiddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.

В какой строке? И давайте пройдемся вместе по коду, чтобы я не тупо переписал, а понял что к чему) код в вб уже:

Код: vbnet
1.
2.
3.
4.
5.
SqlCom = New OleDbCommand("SELECT Таблица1.*(нужно заменить на "Select * from Таблица1" или нет?), DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _ ' здесь задается переменная Q.AvgAvg и высчитываем текущую разницу(рТ)?
                                  & "FROM Таблица1 INNER JOIN" _ ' Объединение запросов
                                  & ("SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _ ' Вот здесь начинается то что вызывает главные трудности) Для начала так понимаю Date() надо изменить здесь?(на что? Как обозначить следующую дату?) В этой строке считаем средний datediff для прошедших событий? Для чего PDKey нужен и сортировка? Всему этому присваиваем значение Q?  
                                  & "ON Событие = Q.Событие" _ 
                                  & "WHERE (((DateDiff(""d"", Дата, Date())) > Q.AvgAvg))", Con) ' Сравнивает два запроса и выводит строки подпадающие под условие?



Заранее спасибо.
...
Рейтинг: 0 / 0
07.03.2016, 17:42
    #39187261
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Если в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlCom = New OleDbCommand("SELECT Таблица1.*, DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _
                                & "FROM Таблица1 INNER JOIN" _
                                & "SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _
                                & "ON Таблица1.Событие = Q.Событие" _
                                & "WHERE DateDiff(""d"", Дата, Date()) > Q.AvgAvg", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Grid.DataSource = DT
        Con.Close()
...
Рейтинг: 0 / 0
07.03.2016, 17:54
    #39187265
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_winОшибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Во всех строках не хватает пробелов между частями выражения. И они сливаются в непонятное для компилятора запросов. Поставьте пробелы в конце или начале строк.
...
Рейтинг: 0 / 0
07.03.2016, 17:55
    #39187266
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Пробелы забыл) Теперь так: Ошибка синтаксиса в предложении FROM
...
Рейтинг: 0 / 0
07.03.2016, 18:24
    #39187271
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win__Michelleiddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.
В какой строке?Простите, отвлекли.)))
Сейчас попробую показать...
...
Рейтинг: 0 / 0
07.03.2016, 18:47
    #39187279
VB2010е, Access, Запрос к БД
iddqd_winЕсли в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlCom = New OleDbCommand("SELECT Таблица1.*, DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _
                                & "FROM Таблица1 INNER JOIN" _
                                & "SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _
                                & "ON Таблица1.Событие = Q.Событие" _
                                & "WHERE DateDiff(""d"", Дата, Date()) > Q.AvgAvg", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Grid.DataSource = DT
        Con.Close()

перед SELECT PDKey скобки не хватает
...
Рейтинг: 0 / 0
07.03.2016, 18:51
    #39187280
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT T.*, 
DateDiff("d", T.Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS DD, 
Q.AvgAvg
FROM Таблица1 AS T INNER JOIN 
(SELECT Событие, Avg(DateDiff("d", Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q 
ON T.Событие = Q.Событие
WHERE (((DateDiff("d", T.Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) > Q.AvgAvg));

Ну вот, наскоро, надеюсь, без ошибок.
Здесь буква "T" - алиасное имя таблицы Таблица1 - латинская.
Попробуйте выполнить как запрос из окна БД.
Если результат будет похож на ожидаемый, тогда посмотрим, что дальше.
...
Рейтинг: 0 / 0
07.03.2016, 20:06
    #39187302
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelle,
Если выполнять запрос в Access то просит ввести T.Событие. Если ввожу Событие1 то выводит следующее
Событие Дата DD AvgAvgСобытие1 27.02.2016 6 4Событие1 25.02.2016 8 4Событие2 27.02.2016 6 4Событие2 23.02.2016 10 4

Исходная таблица выглядит так

Событие Дата Событие1 25.02.2016 Событие1 27.02.2016 Событие1 29.02.2016 Событие1 02.03.2016 Событие1 04.03.2016 Событие2 23.02.2016 Событие2 27.02.2016 Событие2 03.03.2016 Событие2 06.03.2016

То есть что то не так) Да и ввод Т.События меня настораживает)
...
Рейтинг: 0 / 0
07.03.2016, 20:47
    #39187312
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win,

Да, не должно ничего требовать.
Вот, попробуйте, пожалуйста.
Код: sql
1.
2.
3.
4.
5.
SELECT T.*, DateDiff("d",T.Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS DD, Q.AvgAvg
FROM Таблица1 AS T INNER JOIN (SELECT Событие, Avg(DateDiff("d",Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) AS AvgAvg
FROM Таблица1 AS T
GROUP BY Событие) AS Q ON T.Событие = Q.Событие
WHERE (((DateDiff("d",T.[Дата],(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)))>Q.[AvgAvg]));
...
Рейтинг: 0 / 0
08.03.2016, 09:32
    #39187411
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelle,
Ни чего вводить не просит)
Событие Дата DD AvgAvgСобытие1 27.02.2016 6 4Событие1 25.02.2016 8 4Событие2 27.02.2016 8 575Событие2 23.02.2016 12 575
Но не то) Здесь DD взято от максимального события, а не от сегодня - это я подправил.
Событие Дата DD AvgAvgСобытие1 02.03.2016 6 4Событие1 29.02.2016 8 4Событие1 27.02.2016 10 4Событие1 25.02.2016 12 4Событие2 27.02.2016 10 575Событие2 23.02.2016 14 575
А вот средняя не правильно считается. Как я понимаю, тут главное правильно составить алгоритм определения предыдущей даты?
Что-то типа дата для события1 которая меньше даты события1 искомой и если их несколько то максимальная из дат и все это загнать сначала в DateDiff а потом в Avg. И нужно еще исключить повторения, то есть надо вывести максимальное для события попадающего под условия.
Заранее спасибо за оказанную помощь.
Ну и пользуясь случаем, с 8 марта Вас!)
...
Рейтинг: 0 / 0
08.03.2016, 13:01
    #39187458
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win,

Спасибо за поздравление! Очень приятно!

Все-таки, "рТ - Текущая разница с последней датой для данного события" ( 18905198 ), или "с сегодняшней датой" ( 18907641 )?
Если "с сегодняшней датой", то вот результат в табличке, подходит?
Пока для наглядности выводятся все строки и добавлен столбец Res.Событие Дата DD AvgAvg ResСобытие1 25.02.2016 12 8 >Событие1 27.02.201610 8 >Событие1 29.02.2016 8 8 =Событие1 02.03.2016 6 8 <Событие1 04.03.2016 4 8 <Событие2 23.02.2016 14 7.75 >Событие2 27.02.2016 10 7.75 >Событие2 03.03.2016 5 7.75 <Событие2 06.03.2016 2 7.75 <
...
Рейтинг: 0 / 0
09.03.2016, 08:00
    #39187787
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelle,

Да рТ с сегодня разница, то есть пока событие не произошло еще раз, рС между событиями, средняя переодичность.
...
Рейтинг: 0 / 0
09.03.2016, 09:39
    #39187838
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win,

То есть, "последняя дата" это не "максимальная для события", а "предыдущая относительно данной даты события"?
Тогда вариант:
Запрос 1. Определяем интервалы между датами события.
Код: sql
1.
2.
3.
4.
SELECT Событие, Дата, 
Avg(DateDiff("d",(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие AND Дата<T.Дата ORDER BY Дата DESC),Дата)) AS DD
FROM Таблица1 AS T
GROUP BY Событие, Дата;

РезультатСобытие Дата DDСобытие1 25.02.2016 Событие1 27.02.2016 2Событие1 29.02.2016 2Событие1 02.03.2016 2Событие1 04.03.2016 2Событие2 23.02.2016 Событие2 27.02.2016 4Событие2 03.03.2016 5Событие2 06.03.2016 3Запрос 2. Определяем среднее значение интервала для каждого события.
Код: sql
1.
2.
3.
SELECT Событие, Avg(DD) AS AvgAvg
FROM Запрос1
GROUP BY Событие;

РезультатСобытие AvgAvgСобытие1 2Событие2 4Запрос 3. Искомый результат. Выбираем записи с интервалами выше среднего для события.
Код: sql
1.
2.
3.
SELECT Запрос1.*, Запрос2.AvgAvg
FROM Запрос1 INNER JOIN Запрос2 ON Запрос1.Событие = Запрос2.Событие
WHERE Запрос1.DD > Запрос2.AvgAvg;

РезультатСобытие Дата DD AvgAvgСобытие2 03.03.2016 5 4
Ну как, подходит?)))
...
Рейтинг: 0 / 0
09.03.2016, 11:46
    #39187936
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
Идеально) Огромное Вам спасибо!!!
...
Рейтинг: 0 / 0
09.03.2016, 12:22
    #39187985
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
))).
Оказалось, самое трудное - правильно понять (или сформулировать?) задачу.)))
...
Рейтинг: 0 / 0
09.03.2016, 21:04
    #39188604
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelle,
Поторопился маленько)) Забыли самое главное)) ввел еще один запрос(рТН) для определения DateDiff с события до сегодня
Код: plsql
1.
2.
3.
SELECT T.Событие, T.Дата, DateDiff("d",T.Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS Текущая
FROM Таблица1 AS T
GROUP BY T.Событие, T.Дата;


И теперь последний запрос
Код: plsql
1.
2.
3.
SELECT рТН.*, рС.Средняя
FROM рТН INNER JOIN рС ON рТН.Событие=рС.Событие
WHERE рТН.Текущая>рС.Средняя;


И теперь не могу сгруппировать чтобы только самое последнее отображалось
...
Рейтинг: 0 / 0
09.03.2016, 21:10
    #39188609
iddqd_win
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
__Michelle,

То есть чтобы получилось примерно следующее:
Событие ПоследняяДата ТекущаяРазница СредняяРазница
...
Рейтинг: 0 / 0
09.03.2016, 21:20
    #39188615
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB2010е, Access, Запрос к БД
iddqd_win,

Правильно ли я понимаю, что требуется что-то вроде прогноза - каким был бы интервал, если событие произошло бы сегодня.
И средний интервал рассчитать с учетом полученного значения.
Так или нет?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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