Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

создать запрос по периодам... [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо