Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Вниз

создать запрос по периодам...   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
8-34132
Маратка
2002-07-17 16:13
2002.11.11
Вхождение части фигуры в прямоугольник


3-33871
DN
2002-10-21 17:32
2002.11.11
Считываю данные из текстового файла в парадоксовскую таблицу, пос


14-34250
Zergling
2002-10-22 13:33
2002.11.11
C#


4-34295
Xemax
2002-09-29 20:20
2002.11.11
Как запустить процесс с провами system ?


1-34006
GOD
2002-11-02 02:21
2002.11.11
Ну КАк ВАМ СКАЗАТЬ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский