Простой вопрос по построениею запроса
Помощь нужна катастрофически. Не проходите мимо 8-)
таблица1:
COL1 COL2 COL3
ааа _ 100 _ 01.01.2003
ааа _ 150 _ 10.01.2003
ббб _ 200 _ 01.02.2003
ббб _ 300 _ 20.03.2003
Что нужно:
Для каждого уникального значения столбца COL1 подсчитать сумму значений COL2 для всех записей где значение COL3 меньше чем у обрабатываемой записи.
Похожая задача недавно гдето проходила но я ещё раз обращаю внимание на то что с VB я не знаком и функции писать и подключать неспособен. Поэтому искомая операция должна легко влазить в столбец "поле" конструктора запросов.
Вопрос. Запросы делаю в конструкторе, поэтому имейте снисхождение 8-)
Помощь нужна катастрофически. Не проходите мимо 8-)
таблица1:
COL1 COL2 COL3
ааа _ 100 _ 01.01.2003
ааа _ 150 _ 10.01.2003
ббб _ 200 _ 01.02.2003
ббб _ 300 _ 20.03.2003
Что нужно:
Для каждого уникального значения столбца COL1 подсчитать сумму значений COL2 для всех записей где значение COL3 меньше чем у обрабатываемой записи.
Не очень понятно какое значениебыть Col3 у обрабатываемой записи, которая должна быть, как я понимаю, уникальной.
В принципе я предполагаю два шага решения
1 - создание набора с уникальным Col1
2 - суммирование по группам по условию, что дата меньше чем в созданном наборе.
Тебе подойдет SQL или надо описание работы в конструкторе?
Вопрос. Запросы делаю в конструкторе, поэтому имейте снисхождение 8-)
Помощь нужна катастрофически. Не проходите мимо 8-)
таблица1:
COL1 COL2 COL3
ааа _ 100 _ 01.01.2003
ааа _ 150 _ 10.01.2003
ббб _ 200 _ 01.02.2003
ббб _ 300 _ 20.03.2003
Что нужно:
Для каждого уникального значения столбца COL1 подсчитать сумму значений COL2 для всех записей где значение COL3 меньше чем у обрабатываемой записи.
Не очень понятно какое брать значение Col3 у обрабатываемой записи, которая должна быть, как я понимаю, уникальной.
В принципе я предполагаю два шага решения
1 - создание набора с уникальным Col1
2 - суммирование по группам по условию, что дата меньше чем в созданном наборе.
Тебе подойдет SQL или надо описание работы в конструкторе?
from table
where col3 < some_date
group by col1
но поскольку мне нужно найти все строки, где tab1.col3 меньше чем его значение в обрабатываемой строке, date должен быть равен текущему значению столбца col3 т.е.
select sum(col2) from tab1 where tab.1col3<tab1.col3 что есть абсурд. можно ли записать текущее значение столбца col3 во временную переменную? или как быть?
что значит обрабатываемая строка?
Вот пример необходимого мне подзапроса на си-подоюном языке.
GetSum(int var1,int var 2)
{
sum=0;
tab1.Begin();
while(tab1.col1!=NULL)
{
if(tab1.col1==var1)
if(tab1.col3<=var2)
sum+=tab1.col2;
tab1.Next();
}
return sum;
}
И вот эта функция должна бы стоять в поле "Поле" конструктора запросов для интересующего столбца.
SELECT COL1, COL2, COL3, DSum("COL2","tbl","clng([COL3]) <= " & CLng([COL3]) & " AND [COL1] = '" & [COL1] & "'") AS [SUM] FROM tbl
Решение работает. Но я забыл указать ещё одно ограничение:
надо чтобы даты всех просматриваемых накладных были не просто меньше чем у выбранной накладной, но и попадали в тотже месяц и тотже год. Для этого использую функцию DateAdd() один из параметров которой - строковый (например DateAdd("m";1;MyDate) ). Но поскольку мы используем функцию DSum() необходимое выражение уже стоит в кавычках. Таким образом нужен просто совет по синтаксису - как использовать кавычки в кавычках?
Вот мой запрос. Он не проходи синтаксическую проверку. Почему.
N_quant: [dogovor].[quantity]-DSum("quantity";"naklpol";"CLng([naklpol].[date]) <= " & CLng([naklpol].[date]) & "AND [naklpol].[dog_num] = " & [naklpol].[dog_num] & "AND Month(DateAdd('m';1;[naklpol].[date])) = " & Month(DateAdd('m';1;[naklpol].[date])) & "AND Year(DateAdd('m';1;[naklpol].[date])) = " & Year(DateAdd('m';1;[naklpol].[date])) & "")
N_quant: [dogovor].[quantity]-DSum("quantity";"naklpol";"CLng([naklpol].[date]) <= " & CLng([naklpol].[date]) & "AND [naklpol].[dog_num] = " & [naklpol].[dog_num] & "AND Month([naklpol].[date]) = " & Month([naklpol].[date]) & "AND Year([naklpol].[date]) = " & Year([naklpol].[date]) & "")+[naklpol].[quantity]
Может можно чтото изменить в натсройках аксеса? Или как? Я уже слышал о такой проблеме но не слышал чтобы ктото её решил..
Дополнительно: как реализовать на SQL такую операцию ?
if(tab1.col1==NULL) tab1.col1=10; else tab1.col1=20;
Таким образом нужен просто совет по синтаксису - как использовать кавычки в кавычках?
В VBA для SQL-запроса я использую апостроф как кавычку, например
"WHERE (p_pl>9 and brak<>'*' and A>0)"
наверное и тебе подойдет?
1. Access может падать когда пытается выполнить хитрожопо-составленный запрос, который проходит проверку на синтаксис, но нормально выполниться не может в силу логических ошибок в конструкции запроса
2. Нормально составленный запрос, но из-за своей сложности (ну например запрос на объединение и т.д.) просто не может быть отображен в конструкторе запросов. К сожалению этот вид не блокируется и необходимо следить чтобы случайно из SQL режима не переключиться в режим конструктора.
Возникающие в этих двух случаях падение Access не лечится ни какими настройками, считайте это его особенностью...
По поводу кавычек. Одинарные кавычки я всовывал с самого начала, но хоть бы хны. В середине дня попробую составить элементарный пример с DSum("..","..","..DateAdd()..") и выложить его на скачивание.
[B
Дополнительно: как реализовать на SQL такую операцию ?
if(tab1.col1==NULL) tab1.col1=10; else tab1.col1=20;
Например:
SELECT tab1.col2, tab1.col3, IIf(tab1.col1 Is Null, 10, 20) AS Tab1Col1
т.е. вместо столбца tab1.col1 ты выводишь вычисляемый столбец (в конструкторе запросов они их называют - Выражение), ну а AS даешь ему какое-нибудь уникальное название