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

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

Агрегатные функции со строками AVG(), min(),max()... [D6, FireBird SS 1.5 win]


DSKalugin ©   (2004-08-02 15:55:00) 

Есть таблица №1 состояний продукции на складе со значениями
не заказана,
заказана,
поступила,
продана,
нет на складе(не поступила на склад от поставщиков).

таблица заказов №2, одним из полей в которой фигурирует состояние заказа со значением из табл №1

представление №3 которое выводит список заказов из таблицы №2
(групировка по основным полям табл №2)

проблема в том, что наряду с товаром "продана" и "поступила" в заказе могут быть детали с сост. "нет на складе", и тогда операция GROUP BY ..., "Состояние", ...возвращает 2е строчки. А нужна одна. Сначала я в этом представлении указал
Where "Состояние"<>'нет на складе'
но попался такой заказ, который содержал одну непоступившую (сост ='нет на складе')позицию. Из-за чего заказ не попал в список заказов (предст №3)
Агрегатные функции со строками AVG(), min(),max() не проходят.
Как решить эту задачу если в списке заказов должны быть показаны все заказы, но при этом не дублировались состояния?


DSKalugin   (2004-08-02 18:26:00) [1]

решена, спасибо Johnmen, Sandman25 и ZHK :-)))


Johnmen   (2004-08-02 17:12:00) [2]

>DSKalugin ©   (02.08.04 17:03) [11]

>только признаки.

Так я и спрашивал, чьи они ?

>MIN() заработал как надо!

Т.е. задача решена ?


ZHK   (2004-08-02 17:06:00) [3]


> Johnmen ©   (02.08.04 16:54) [10]
> AVG для символьных полей - это сильно...:)

Гы. :-) Да и правда сильно. Видимо о женщинах думал, а не о функциях. :-)


DSKalugin   (2004-08-02 17:03:00) [4]

2 Johnmen ©   (02.08.04 16:41) [6]

только признаки. Структуру см выше в [4]
"detail_position_book"

> AVG для символьных полей - это сильно...:)
ООООооо спасибо!!! Я тормоз, признаю :-)))))))))))
Пробовал именно эту функцию, IBExpert ругнулся и я поспешно сделал выводы о неприемлимости такого рода операций над строками.
MIN() заработал как надо! Спасибо :-))))


Johnmen   (2004-08-02 16:54:00) [5]

AVG для символьных полей - это сильно...:)


ZHK   (2004-08-02 16:50:00) [6]


> Sandman25 ©   (02.08.04 16:43) [7]
> [5] DSKalugin ©   (02.08.04 16:40)
>
> Над строчными типами агрегатные функции не выполняются
>
> Попробуйте, будете удивлены.

Да, выполняются, аж за ушами свистит. Я базу веду, там значения только строчные. Работают... И денег не просят. И Min и Max и Avg... Все пробовал. Лично.


Соловьев   (2004-08-02 16:46:00) [7]


> Над строчными типами агрегатные функции не выполняются

count :)


Sandman25   (2004-08-02 16:43:00) [8]

[5] DSKalugin ©   (02.08.04 16:40)

Над строчными типами агрегатные функции не выполняются

Попробуйте, будете удивлены.


Johnmen   (2004-08-02 16:41:00) [9]

Теперь надо определиться, что есть т.№1. Это признаки заказа ?
Или/и чего-то ещё ?


DSKalugin   (2004-08-02 16:40:00) [10]

>а если есть разные заказы но с одинаковвым состоянием?
будут 2 строчки в списке заказов.
Список заказов "inp_ZakList" на то и есть, чтобы отображать список заказов. Он строится на основе таблицы заказов "opt_ICars" в которой хранится начинка=содержимое заказов (товар, кол-во , цена, дата, номер, клиент, поставщик...)

>max("состояние"). это бы сработало, если бы состояние было численным значением, а так я его вывожу в строчном. Над строчными типами агрегатные функции не выполняются


DSKalugin   (2004-08-02 16:33:00) [11]

таб №1 состояния
CREATE TABLE "detail_position_book" (
   "cod"       INTEGER NOT NULL,
   "position"  VARCHAR(20) NOT NULL
);

таб №2 заказы
CREATE TABLE "opt_ICars" (
   "cod"            INTEGER NOT NULL,
   "FDate"          DATE,
   "ID_seller"      INTEGER,
   "seller_number"  VARCHAR(30), (имя товара)
   "sell_orig_ID"   VARCHAR(10),
   "ZCount"         SMALLINT,
   "SPrice"         NUMERIC(15,5),
   "SCount"         VARCHAR(5),
   "PostCnt"        SMALLINT default 0 NOT NULL,
   "skl_cod"        VARCHAR(30),
   "maker_name"     VARCHAR(30),
   "skl_ID"         INTEGER,
   "ID_dnb"         INTEGER,
   "id_client"      INTEGER NOT NULL,
   "manager"        INTEGER,
    "condition"      INTEGER,
   "input_No"       INTEGER,
   "output_No"      INTEGER,
   "info_plus"      VARCHAR(59),
   "SendDate"       DATE,
   "nacenka"        NUMERIC(10,5),
   "ZamovNo"        INTEGER default 0 NOT NULL,
   "PostPrice"      NUMERIC(15,5) default 0 NOT NULL
);

таб №3 представление со списком заказов
CREATE VIEW "inp_ZakList"(
   "inDate",
   "seller",
   "input_No",
   "client_short",
   "Nacenka",
   "SendDate",
   "output_No",
    "condition")
AS
SELECT "opt_ICars"."FDate", (дата)
 "detail_sellers_book"."ds_name", (имя поставщика)
 "opt_ICars"."input_No", (входящий номер)
 "FirmsAttributes"."ShortName", (имя клиента)
 "opt_ICars"."nacenka",
 "opt_ICars"."SendDate",
 "opt_ICars"."output_No",
 "detail_position_book"."position"
FROM "opt_ICars"
  INNER JOIN "detail_sellers_book" ON ("opt_ICars"."ID_seller" = "detail_sellers_book"."cod")
  INNER JOIN "FirmsAttributes" ON ("opt_ICars"."id_client" = "FirmsAttributes"."f_ID")
  inner join "detail_position_book" on   (("detail_position_book"."cod" = "opt_ICars"."condition") and ("opt_ICars"."condition"<>10))
group by "opt_ICars"."FDate",
 "detail_sellers_book"."ds_name",
 "opt_ICars"."input_No",
 "FirmsAttributes"."ShortName",
 "opt_ICars"."nacenka",
 "opt_ICars"."SendDate",
 "opt_ICars"."output_No",
  "detail_position_book"."position";


Sandman25   (2004-08-02 16:03:00) [12]

Убрать "состояние" из group by, заменить его в select на max("состояние").

А, по-хорошему, именно 2 заказа и нужно отображать.


stud   (2004-08-02 16:01:00) [13]


> в списке заказов должны быть показаны все заказы, но при
> этом не дублировались состояния

а если есть разные заказы но с одинаковвым состоянием?


Johnmen   (2004-08-02 16:00:00) [14]

Много неясностей....
Приведи хотя бы запрос.


Наверх

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