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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с GROUP BY 
V
    Опции темы
Olesya
Дата 23.12.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



GROUP BY { поле | Integer } [,...]

в таком варианте все работает:
Код

select tillitem.price, sum(tillitem.qty)
from tillitem
group by tillitem.price


в таком варианте ругается на 1:
Код

select tillitem.price, sum(tillitem.qty)
from tillitem
group by 1


в таком варианте General SQL Error. Column Unknown CURPRICE
Код

select tillitem.price as curprice, sum(tillitem.qty)
from tillitem
group by curprice



Подскажите, пожалуйста, что не так? Мне нужно использовать именно имя поля либо его номер, т.к. в оригинале это поле будет подзапросом
PM MAIL   Вверх
ТоляМБА
Дата 23.12.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


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

Репутация: 1
Всего: 252



Цитата(Olesya @  23.12.2009,  14:40 Найти цитируемый пост)
group by 1

Это только с Order By допустимо.

Цитата(Olesya @  23.12.2009,  14:40 Найти цитируемый пост)
Подскажите, пожалуйста, что не так? Мне нужно использовать именно имя поля либо его номер, т.к. в оригинале это поле будет подзапросом


Что мешает?

Код
Select Field1, Field2
From Table1
Inner join
(select tillitem.price, sum(tillitem.qty)
from tillitem
group by tillitem.price) as A
On Table1.field1=A.Price


PM   Вверх
Olesya
Дата 23.12.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



нет, это не то. приведу полный запрос (не работает)
Код

SELECT ITEM.ITEMCODE, ITEM.ITEMNAME, SUM(TILLITEM.QTY) AS QTY,
    TILLITEM.PRICE, SUM(TILLITEM.TOTAL + TILLITEM.TAXAMT) AS TOTALAMOUNT, ITEM.TAXGRP1,
    SUM(TILLITEM.TAXAMT) AS TAXAMOUNT,
    (SELECT AVGCOST FROM ITEMPRICE_FROM_DATE(CAST(ITEMDOCTRANS.POSTED-1/86400 AS DATE), ITEM.ITEMID)) AS AVGCOSTVALUE,
    SUM(TILLITEM.QTY * (SELECT AVGCOST FROM ITEMPRICE_FROM_DATE(CAST(ITEMDOCTRANS.POSTED-1/86400 AS DATE), ITEM.ITEMID))) AS AVGAMOUNT
FROM ITEM, TILLITEM, ITEMDOCTRANS, TILL
WHERE ITEMDOCTRANS.DAYBATCH_ID >= 400
AND ITEMDOCTRANS.DAYBATCH_ID <= 535
AND ITEMDOCTRANS.ITEMDOCTYPE_ID = 5
AND TILL.ITEMDOC_ID = ITEMDOCTRANS.LINKEDDOC
AND TILLITEM.STATUSTYPE NOT IN (26, 6)
AND TILLITEM.TILLNUM = TILL.TILLNUM
AND TILLITEM.POS_BATCH_ID = TILL.POS_BATCH_ID
AND ITEM.ITEMID = TILLITEM.PLU
AND ITEM.DEPT IN (230801,230802,230803,230804,230805,230901,230902,230903,230904,230905)
GROUP BY ITEM.ITEMCODE, ITEM.ITEMNAME, TILLITEM.PRICE, ITEM.TAXGRP1, AVGCOSTVALUE
ORDER BY ITEM.ITEMCODE, TILLITEM.PRICE, ITEM.TAXGRP1, AVGCOSTVALUE


ругается на AVGCOSTVALUE в строке GROUP BY, unknown column говорит, при этом в строке ORDER BY все нормально

Это сообщение отредактировал(а) Olesya - 23.12.2009, 13:39
PM MAIL   Вверх
Akina
Дата 23.12.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Правильно ругается. Потому что сперва идёт 1) группировка, потом 2) групповые операции, затем 3) сортировка. AVGCOSTVALUE получается на шаге 2, посему использовать его на шаге один невозможно даже теоретически.
Используйте группировку по выражению.


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

PM MAIL WWW ICQ Jabber   Вверх
ТоляМБА
Дата 23.12.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


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

Репутация: 1
Всего: 252



Цитата(ТоляМБА @ 23.12.2009,  15:24)
Цитата(Olesya @  23.12.2009,  14:40 Найти цитируемый пост)
group by 1

Это только с Order By допустимо.

Извиняюсь - всё-таки нормально срабатывает группировка по номеру столбца. FireBird не перестаёт меня удивлять
PM   Вверх
Olesya
Дата 23.12.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



спасибо. а это как  smile ?
Код

GROUP BY (SELECT AVGCOST FROM ITEMPRICE_FROM_DATE(CAST(ITEMDOCTRANS.POSTED-1/86400 AS DATE), ITEM.ITEMID))


так все равно ругается
PM MAIL   Вверх
Akina
Дата 23.12.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Вложенный селект последнего поста - явно firebird only. Вы можете его превратить во что-нить общепонятное?


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

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



например
Код

SELECT AVGCOST FROM ITEMPRICE WHERE ITEMPRICE.PRICEDATE = ITEMDOCTRANS.POSTED AND ITEMPRICE.ITEMID =  ITEM.ITEMID

PM MAIL   Вверх
Olesya
Дата 23.12.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



Akina, помогите сгруппировать, пожалуйста. Работа встала  smile . Если мне придется все это суммировать и группировать ручками, то я сойду с ума!!!!!
PM MAIL   Вверх
Deniz
Дата 23.12.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Olesya, по порядку.
1. Переписать все объединения таблиц на inner join
2. Если я правильно понял, то
Код
(SELECT AVGCOST FROM ITEMPRICE_FROM_DATE(CAST(ITEMDOCTRANS.POSTED-1/86400 AS DATE), ITEM.ITEMID)) AS AVGCOSTVALUE
это хранимая процедура, следовательно можно сделать left join с ней, тогда поле должно сгруппироваться нормально.
Сейчас не могу переделать запрос, если завтра никто не поможет напишу.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Olesya
Дата 23.12.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



да, это процедура. спасибо, добрый человек  smile . буду пробовать
PM MAIL   Вверх
Akina
Дата 23.12.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Olesya @  23.12.2009,  15:03 Найти цитируемый пост)
например

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


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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Olesya, примерный текст запроса
Код
SELECT ITEM.ITEMCODE, ITEM.ITEMNAME, SUM(TILLITEM.QTY) AS QTY,
    TILLITEM.PRICE, SUM(TILLITEM.TOTAL + TILLITEM.TAXAMT) AS TOTALAMOUNT, ITEM.TAXGRP1,
    SUM(TILLITEM.TAXAMT) AS TAXAMOUNT,
    MyProc.AVGCOST AS AVGCOSTVALUE,
    SUM(TILLITEM.QTY * MyProc.AVGCOST) AS AVGAMOUNT
FROM ITEM
  inner join TILLITEM on ITEM.ITEMID = TILLITEM.PLU
  inner join TILL on TILLITEM.TILLNUM = TILL.TILLNUM AND TILLITEM.POS_BATCH_ID = TILL.POS_BATCH_ID
  inner join ITEMDOCTRANS on TILL.ITEMDOC_ID = ITEMDOCTRANS.LINKEDDOC
  left join ITEMPRICE_FROM_DATE(CAST(ITEMDOCTRANS.POSTED-1/86400 AS DATE), ITEM.ITEMID) MyProc on 1=1
WHERE ITEMDOCTRANS.DAYBATCH_ID >= 400
AND ITEMDOCTRANS.DAYBATCH_ID <= 535
AND ITEMDOCTRANS.ITEMDOCTYPE_ID = 5
AND TILLITEM.STATUSTYPE NOT IN (26, 6)
AND ITEM.DEPT IN (230801,230802,230803,230804,230805,230901,230902,230903,230904,230905)
GROUP BY ITEM.ITEMCODE, ITEM.ITEMNAME, TILLITEM.PRICE, ITEM.TAXGRP1, MyProc.AVGCOST
ORDER BY ITEM.ITEMCODE, TILLITEM.PRICE, ITEM.TAXGRP1, MyProc.AVGCOST
запрос не проверял, возможны ошибки.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Olesya
Дата 24.12.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2007

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



БРАВО!!!! Спасибо огромное!!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




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


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

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