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

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

Не выполняется SQL [FireBird 1.5]


Страницы:   1 2

DelphiN! ©   (2008-02-22 07:10:00) 

Написал SQL :


SELECT DISTINCT(CAST(TIME_ AS DATE)) DATA,SUM(SUMM_) TEKUSHAYA_SUMMA,

(SELECT SUM(SUMM_) FROM CASEBASE WHERE (TIME_ > MAIN.TIME_-7)and(TIME_ < MAIN.TIME_)
and(prim_ <> 'Login activated')and (prim_ <> 'Login deactivated'))
Summa_za_poshliy_period

FROM CaseBase MAIN WHERE (TIME_ > '13.08.2007')and(TIME_ < '14.10.2007')
and (prim_ <> 'Login activated') and (prim_ <> 'Login deactivated')
GROUP BY 1
ORDER BY 1


Однако при попытке выполнения FireBird возвращает мне ошибку :

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).


Если я убираю условия выделенные жирным, запрос выполняется без ошибок, в чем моя ошибка?

Dialect 3


Sergey13   (2008-02-22 11:22:00) [21]

> [8] DelphiN!   (22.02.08 10:48)
> в первом столбце - дату,
> во втором - выручку за эту дату*,
> а в третьем - выручку недельной давности от даты в 1ом столбце

Первые 2 столбца вопросов ен вызывают. Но вот третий выходит за границы моего воображения - что-то я не могу придумать для чего это.


Johnmen   (2008-02-22 11:15:00) [22]


> поле TIME_ хранится в базе как TIMESTAMP

>  в базе данных значения в поле TIME_ хранятся в виде 01.
> 01.2008 13:02:01

С человеком, который упорно не желает учить букварь, здесь вряд ли будут разговаривать.


www   (2008-02-22 10:51:00) [23]


> za_ poshliy_period

оно!


DelphiN!   (2008-02-22 10:48:00) [24]

Вообще смысл запроса таков :

Есть база данных с выручкой, в базе данных значения в поле TIME_ хранятся в виде 01.01.2008 13:02:01 мне необходимо вывести

в первом столбце - дату,
во втором - выручку за эту дату*,
а в третьем - выручку недельной давности от даты в 1ом столбце

* Выручка за дату 02.01.2008 это промежуток с 02.01.2008 00:00:00 - 02.01.2008 23:59:59

Тоесть в результате таблица должны выглядеть следующим образом :

01.02.2008    50 000  60 000
02.02.2008    80 000  40 000
...............    ........   .........


DelphiN!   (2008-02-22 10:42:00) [25]


> Sergey13 ©   (22.02.08 09:47) [6]


Первое поле это представление поля TIME_ как DATE. На самом деле поле TIME_ хранится в базе как TIMESTAMP.
 В таком случае почему FireBird не даёт мне использовать поле TIME_ в под запросе?


Sergey13   (2008-02-22 09:47:00) [26]

> [5] DelphiN!   (22.02.08 09:26)
> А как тогда добавить в GROUP BY поле TIME_ чтобы его можно
> было использовать в под запросе и одновременно оставить
> группировку по первому полю?

А "по первому полю" и "поле TIME_" это по разным полям?
DISTINCT тебе зачем?


DelphiN!   (2008-02-22 09:26:00) [27]

Действительно, запрос не выводит уникальные даты в 1ом поле:(

А как тогда добавить в GROUP BY поле TIME_ чтобы его можно было использовать в под запросе и одновременно оставить группировку по первому полю?


Sergey13   (2008-02-22 09:22:00) [28]

> [3] DelphiN!   (22.02.08 09:01)

> Так будет верно?

Ты на кофейной гуще гадаешь? Запусти да проверь. Мой прогноз - не верно.


DelphiN!   (2008-02-22 09:01:00) [29]


> Sergey13 ©   (22.02.08 09:00) [2]



SELECT DISTINCT(CAST(TIME_ AS DATE)) DATA,SUM(SUMM_) TEKUSHAYA_SUMMA,

(SELECT SUM(SUMM_) FROM CASEBASE WHERE (TIME_ > MAIN.TIME_-7)and(TIME_ < MAIN.TIME_)
and(prim_ <> 'Login activated')and (prim_ <> 'Login deactivated'))
Summa_za_poshliy_period

FROM CaseBase MAIN WHERE (TIME_ > '13.08.2007')and(TIME_ < '14.10.2007')
and (prim_ <> 'Login activated') and (prim_ <> 'Login deactivated')
GROUP BY 1,TIME_
ORDER BY 1


Так будет верно?


Sergey13   (2008-02-22 09:00:00) [30]

> [0] DelphiN! ©   (22.02.08 07:10)
> в чем моя ошибка?

В том, что нахватавшись верхов, ты не понимаешь смысла того, что пишешь.
DISTINCT, GROUP BY - как по твоему это должно сочетаться? Твой подзапрос - это агрегат или поле по которому надо агрегировать?


ЮЮ   (2008-02-22 08:23:00) [31]

1) отформатируй
2) если есть GROUP BY, то только агрегатнее функции и поля, перечисленные в GROUP BY

З.Ы. Сосояние не позволяет врубится в смысл запроса, написанного в таком стиле.


Страницы:   1 2

Наверх

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