![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
создать запрос по периодам... [D5, dBase, FoxPro]
leshik © (2002-10-21 09:27:00)Имеется база (FoxPro) с полями "Name", "Kol", "Data".
Нужно сделать запрос, что бы получилось:
Name, Сумма по Kol за период (Data<=Dat1), Сумма по Kol за период (Data>Dat1). И все это сгруппировать по Name.
Можно ли это сделать за один запрос, если можно то как?
Если нельзя, то как же сделать вообще?
Leshik (2002-10-22 15:48:00) [1]> Ты установил Database Driver Name = Microsoft Visual FoxPro Driver
А гдже это можно установить? У меня только объекты Query, DataSource и DBGrig...
passm (2002-10-22 09:55:00) [2]Leshik © (22.10.02 07:12)> Ты установил Database Driver Name = Microsoft Visual FoxPro Driver и проверил на выполнимость IIF?
Johnmen (2002-10-22 09:45:00) [3]>passm ©
>Осирис ©
Попрошу быть внимательней ! В вопросе указан тип БД !
>Leshik ©
Лично я в данном случае использовал бы несколько простых запросов и объединял их, используя TRxMemoryData.
Есть, правда, еще вариант запроса с UNION, но он не годится для целей отображения...
Leshik (2002-10-22 07:12:00) [4]Если нельзя в одном запросе, то как сделать в нескольких... но чтобы работало быстро, а то я испытавал вариант "Johnmen © (21.10.02 15:48)" - работает целую вечность. Поясню, что база содержит около 50000 записей.
Осирис (2002-10-21 18:27:00) [5]Есть вариант сделать это в виде хранимой процедуры в которой:
1. Пределять миним. и максим. даты
2. На основании этих данных формировать временную таблицу периодов
3. Непосредственно возвращать запрос
Но совместить это в одном запросе похоже нельзя :(
passm (2002-10-21 18:04:00) [6]Осирис © (21.10.02 17:29)> Нет, так как автору вопроса необходимо по столбцу на каждый период, то получается, что возвращаемое количество столбцов заранее неизвестно.
Ежели по строкам, то, ИМХО, диапазоны хранить в отдельной таблице, если их количество может быть много и заранее неизвестно.
А по раскладке на месяцы:
SELECT Q1.N_MONTH, Q1.N_YEAR, SUM(Q2.KOL) AS SUM_KOL
FROM (SELECT T1.ID, MONTH(T1.DATE) AS N_MONTH, YEAR(T1.DATE) AS N_YEAR
FROM TABLE1 AS T1) AS Q1
INNER JOIN TABLE1 Q2 ON (Q1.ID = Q2.ID)
GROUP BY Q1.N_MONTH, Q1.N_YEAR
Но это если поддерживается SELECT... FROM (SELECT...
Осирис (2002-10-21 17:29:00) [7]Разрешите развить эту тему. Оставим структуру таблицы прежней, но добавим условие, что диапазон дат заранее не известен, а данные надо разбивать по месяцам. То есть:
SELECT SUM(T2.KOL) FROM TABLE1 T2
WHERE (T2.id=T1.id) AND (T2.DATA<=...)AND (T2.DATA>=...)) AS S1,
количество этих select"ов заранее неизвестно.
В свое время когда передо мной стала такая задача, я динамически формировал строку запроса на клиенте и посылал ее на сервер. А может эту же задачу можно решить свойствами T-SQL ?
Johnmen (2002-10-21 15:48:00) [8]>passm © (21.10.02 15:21)
SELECT
T1.NAME,
(SELECT SUM(T2.KOL) FROM TABLE1 T2
WHERE (T2.id=T1.id) AND (T2.DATA<=...)) AS S1,
(SELECT SUM(T3.KOL) FROM TABLE1 T3
WHERE (T3.id=T1.id) AND (T3.DATA>...)) AS S2
FROM TABLE1 T1
GROUP BY T1.NAME
passm (2002-10-21 15:21:00) [9]Johnmen © (21.10.02 15:13)> 1. Можно написать универсальный запрос- поясни, если не трудно.
Leshik © (21.10.02 14:59)> По большому счету Delphi тут ни при чем, и искать в help"е описание Fox"ового SQL бесполезно. Проверь драйвер (Microsoft Visuel FoxPro Driver) - может тут собака зарыта :)
Johnmen (2002-10-21 15:13:00) [10]1. Можно написать универсальный запрос
2. ??? причем здесь D, если тебе нужен запрос ?
3. Нет...
LordOfSilence (2002-10-21 15:11:00) [11]По поводу IIF:
То о чем Вы говорите - немного из разных опер.
У Вас проблема в том, как я понимаю, что синтаксис
локального SQL не поддерживает конструкцию IIF.
А аналог ФоксПрошного IIF в Delphi, imho, IfThen().
Leshik (2002-10-21 14:59:00) [12]И что можно будет сделать, если будет поле с уникальным индентификатором?
Кстати, команда IIF есть в FoxPro - а есть ли аналигочная команда в Delphy?
А можно создать и использовать пользовательскую функцию в запросе?
Johnmen (2002-10-21 14:22:00) [13]>Leshik © (21.10.02 14:02)
>Да и нет необходимости в нем.
Так думают многие, пока не столкуться с проблемами !
Одна из них - твой запрос...
Leshik (2002-10-21 14:02:00) [14]Уникального идентификатора записи нет...
Да и нет необходимости в нем.
Johnmen (2002-10-21 13:48:00) [15]А есть еще поле - уникальный идентификатор записи ?
Leshik (2002-10-21 13:31:00) [16]Я пробовал, но выдается ошибка. По всей видимости он не понимает команду IIF. Она вообще существует? В HELPe к Delphy 5 такой команды нет.
passm (2002-10-21 10:37:00) [17]leshik © (21.10.02 09:27)>
SELECT T1.NAME, SUM(IIF(T1.DATA <= :DAT1, T1.KOL, 0)) AS SUM_KOL_1, SUM(IIF(T1.DATA > :DAT1, T1.KOL, 0)) AS SUM_KOL_2
FROM TABLE1 AS T1
GROUP BY T1.NAME