Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отсортировать по дате сгруппированный запрос, не получается 
V
    Опции темы
ksili
Дата 20.5.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



FireBird 2.0

Есть такая таблица:
Код

CREATE TABLE T_CARD (
    ID_CARD           INTEGER NOT NULL,
    ACTIVATED_DATE    TIMESTAMP,
    ID_AFFILATE_USER  INTEGER,
    COMMENT           CHAR(50),
    SUMMA             NUMERIC(15,2) NOT NULL
);

К ней выпоняется запрос:
Код

select cast(extract(MONTH from ACTIVATED_DATE) as integer)||'.'||cast(extract(YEAR from ACTIVATED_DATE) as integer) as MON,
    count(ID_CARD) as cou,sum(SUMMA) as itog from T_CARD
where ID_AFFILATE_USER=1 and COMMENT='A'
    and ACTIVATED_DATE between '01.12.07' and current_timestamp
group by cast(extract(MONTH from ACTIVATED_DATE) as integer)||'.'||cast(extract(YEAR from ACTIVATED_DATE) as integer)

который возвращает например:
Код

MON    COU    ITOG
1.2008    5    900
12.2007  1    150
2.2008    2    600

а надо чтобы было в другом порядке:
Код

12.2007  1    150
1.2008    5    900
2.2008    2    600

пробовал использовать order by по тому же по чему группирую, но не получается, т.к. это поле получается строковым, а не timestamp например

Это сообщение отредактировал(а) ksili - 20.5.2008, 10:08


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Magnifico
Дата 20.5.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



ksili  врт так попробуй : сортирум сначал по году потом по месяцу (отслеживаем где находится разделитель точка)
Код

select   *  from
 (
  select cast(extract(MONTH from ACTIVATED_DATE) as integer)||'.'||cast(extract(YEAR from ACTIVATED_DATE) as integer) as MON,
    count(ID_CARD) as cou,sum(SUMMA) as itog from T_CARD
--where ID_AFFILATE_USER=1 and COMMENT='A'
--and ACTIVATED_DATE between '01.12.07' and current_timestamp
group by cast(extract(MONTH from ACTIVATED_DATE) as integer)||'.'||cast(extract(YEAR from ACTIVATED_DATE) as integer)

)
 order by cast(case when  SUBSTRING(mon FROM 2 FOR 1)  ='.'  then SUBSTRING(mon FROM 3 FOR 10) else SUBSTRING(mon FROM 2 FOR 10)  end as integer) , 
cast(case when  SUBSTRING(mon FROM 2 FOR 1)  ='.'  then SUBSTRING(mon FROM 1 FOR 1) else SUBSTRING(mon FROM 1 FOR 2)
 end as integer)



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
ksili
Дата 20.5.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Magnifico, монструозно, но работает  smile  smile 
Спасибо большое! Интересная конструкция. Я бы до такого не додумался. Вообще никогда ещё в запросах when, then, else и end не пользовался. Теперь возьму на вооружение.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akina
Дата 20.5.2008, 12:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Если дата присутствует в строковом формате, а не в формате даты-времени, для сортировки она приводится к строке формата yyyy/mm/dd hh:mm:ss (с ведущими нулями), тогда строковая сортировка срабатывает правильно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ksili
Дата 20.5.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Цитата(Akina @  20.5.2008,  16:13 Найти цитируемый пост)
Если дата присутствует в строковом формате, а не в формате даты-времени, для сортировки она приводится к строке формата yyyy/mm/dd hh:mm:ss (с ведущими нулями), тогда строковая сортировка срабатывает правильно.

Тоже вариант, но у меня потом это значение выводится пользователю, поэтому хотелось, чтобы был самый привычный формат mm.yyyy и без излишних преобразований. Но тоже спасибо за подсказку!


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.