Текущий архив: 2002.11.11;
Скачать: CL | DM;
Внизсоздать запрос по периодам... Найти похожие ветки
← →
leshik (2002-10-21 09:27) [0]Имеется база (FoxPro) с полями "Name", "Kol", "Data".
Нужно сделать запрос, что бы получилось:
Name, Сумма по Kol за период (Data<=Dat1), Сумма по Kol за период (Data>Dat1). И все это сгруппировать по Name.
Можно ли это сделать за один запрос, если можно то как?
Если нельзя, то как же сделать вообще?
← →
passm (2002-10-21 10:37) [1]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
← →
Leshik (2002-10-21 13:31) [2]Я пробовал, но выдается ошибка. По всей видимости он не понимает команду IIF. Она вообще существует? В HELPe к Delphy 5 такой команды нет.
← →
Johnmen (2002-10-21 13:48) [3]А есть еще поле - уникальный идентификатор записи ?
← →
Leshik (2002-10-21 14:02) [4]Уникального идентификатора записи нет...
Да и нет необходимости в нем.
← →
Johnmen (2002-10-21 14:22) [5]>Leshik © (21.10.02 14:02)
>Да и нет необходимости в нем.
Так думают многие, пока не столкуться с проблемами !
Одна из них - твой запрос...
← →
Leshik (2002-10-21 14:59) [6]И что можно будет сделать, если будет поле с уникальным индентификатором?
Кстати, команда IIF есть в FoxPro - а есть ли аналигочная команда в Delphy?
А можно создать и использовать пользовательскую функцию в запросе?
← →
LordOfSilence (2002-10-21 15:11) [7]По поводу IIF:
То о чем Вы говорите - немного из разных опер.
У Вас проблема в том, как я понимаю, что синтаксис
локального SQL не поддерживает конструкцию IIF.
А аналог ФоксПрошного IIF в Delphi, imho, IfThen().
← →
Johnmen (2002-10-21 15:13) [8]1. Можно написать универсальный запрос
2. ??? причем здесь D, если тебе нужен запрос ?
3. Нет...
← →
passm (2002-10-21 15:21) [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:48) [10]>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
← →
Осирис (2002-10-21 17:29) [11]Разрешите развить эту тему. Оставим структуру таблицы прежней, но добавим условие, что диапазон дат заранее не известен, а данные надо разбивать по месяцам. То есть:
SELECT SUM(T2.KOL) FROM TABLE1 T2
WHERE (T2.id=T1.id) AND (T2.DATA<=...)AND (T2.DATA>=...)) AS S1,
количество этих select"ов заранее неизвестно.
В свое время когда передо мной стала такая задача, я динамически формировал строку запроса на клиенте и посылал ее на сервер. А может эту же задачу можно решить свойствами T-SQL ?
← →
passm (2002-10-21 18:04) [12]Осирис © (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 18:27) [13]Есть вариант сделать это в виде хранимой процедуры в которой:
1. Пределять миним. и максим. даты
2. На основании этих данных формировать временную таблицу периодов
3. Непосредственно возвращать запрос
Но совместить это в одном запросе похоже нельзя :(
← →
Leshik (2002-10-22 07:12) [14]Если нельзя в одном запросе, то как сделать в нескольких... но чтобы работало быстро, а то я испытавал вариант "Johnmen © (21.10.02 15:48)" - работает целую вечность. Поясню, что база содержит около 50000 записей.
← →
Johnmen (2002-10-22 09:45) [15]>passm ©
>Осирис ©
Попрошу быть внимательней ! В вопросе указан тип БД !
>Leshik ©
Лично я в данном случае использовал бы несколько простых запросов и объединял их, используя TRxMemoryData.
Есть, правда, еще вариант запроса с UNION, но он не годится для целей отображения...
← →
passm (2002-10-22 09:55) [16]Leshik © (22.10.02 07:12)> Ты установил Database Driver Name = Microsoft Visual FoxPro Driver и проверил на выполнимость IIF?
← →
Leshik (2002-10-22 15:48) [17]> Ты установил Database Driver Name = Microsoft Visual FoxPro Driver
А гдже это можно установить? У меня только объекты Query, DataSource и DBGrig...
Страницы: 1 вся ветка
Текущий архив: 2002.11.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c