powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / корзина покупателя
8 сообщений из 8, страница 1 из 1
корзина покупателя
    #32652784
leonbn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем!
Подскажите, как лучше выбрать (получить) усредненную корзину покупателя.
Есть две таблицы:
1) Чеки: Номер чека, дата, сумма, ...
2) Позиции чеков: Номер чека, код_товара, кол-во, цена, сумма, ...
Уже мозги кипят, а результата нет.
...
Рейтинг: 0 / 0
корзина покупателя
    #32652973
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну давай еще добавим табличку - "Товары", например. Не возражаешь?

Ну, вот тебе скрипт:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
 /******************************************************************************/ 
 /***          Generated by IBExpert 2004.08.02 17.08.2004 14:35:19          ***/ 
 /******************************************************************************/ 

SET SQL DIALECT  3 ;

SET NAMES WIN1251;

CREATE DATABASE 'c:\tst.gdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE  4096 
DEFAULT CHARACTER SET WIN1251;



 /******************************************************************************/ 
 /***                               Generators                               ***/ 
 /******************************************************************************/ 

CREATE GENERATOR GEN_BILL_ID;

CREATE GENERATOR GEN_BILL_ITEMS_ID;

CREATE GENERATOR GEN_GOODS_ID;

 /* Из - за лени я создал генератор на номера чеков */ 
CREATE GENERATOR GEN_BILL_NUMBER_ID;
SET GENERATOR GEN_BILL_NUMBER_ID TO  4 ;




 /******************************************************************************/ 
 /***                                 Tables                                 ***/ 
 /******************************************************************************/ 


 /* Чек */ 
CREATE TABLE BILL (
    BILL_ID      INTEGER NOT NULL,
    BILL_NUMBER  INTEGER,
    MOMENT       TIMESTAMP DEFAULT 'NOW',
    SUMMA        NUMERIC( 12 , 2 )
);

 /* Позиции чеков */ 
CREATE TABLE BILL_ITEMS (
    BILL_ITEMS_ID  INTEGER NOT NULL,
    GOODS_ID       INTEGER NOT NULL,
    BILL_ID        INTEGER NOT NULL,
    QNT            DECIMAL( 15 , 2 ) DEFAULT  0  NOT NULL,
    PRICE          DECIMAL( 15 , 2 ) DEFAULT  0  NOT NULL,
    SUMMA          COMPUTED BY (QNT * PRICE)
);

 /* Товары */ 
CREATE TABLE GOODS (
    GOODS_ID  INTEGER NOT NULL,
    NAME      VARCHAR( 50 ) CHARACTER SET WIN1251
);




 /******************************************************************************/ 
 /***                              Primary Keys                              ***/ 
 /******************************************************************************/ 

ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY (BILL_ID);
ALTER TABLE BILL_ITEMS ADD CONSTRAINT PK_BILL_ITEMS PRIMARY KEY (BILL_ITEMS_ID);
ALTER TABLE GOODS ADD CONSTRAINT PK_GOODS PRIMARY KEY (GOODS_ID);


 /******************************************************************************/ 
 /***                              Foreign Keys                              ***/ 
 /******************************************************************************/ 
 /* Ну, тут сам исправь, как надо и что надо...*/ 
ALTER TABLE BILL_ITEMS ADD CONSTRAINT FK_BILL_ID FOREIGN KEY (BILL_ID) REFERENCES BILL (BILL_ID);
ALTER TABLE BILL_ITEMS ADD CONSTRAINT FK_GOODS_ID FOREIGN KEY (GOODS_ID) REFERENCES GOODS (GOODS_ID);


 /******************************************************************************/ 
 /***                                Triggers                                ***/ 
 /******************************************************************************/ 


SET TERM ^ ;


 /* Trigger: BILL_BI */ 
CREATE TRIGGER BILL_BI FOR BILL
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW.BILL_ID IS NULL) THEN
    NEW.BILL_ID = GEN_ID(GEN_BILL_ID, 1 );
END
^

 /* Trigger: BILL_ITEMS_AIUD0 */ 
 /* Автогенерация суммы в чеке при изменении позиций */ 
CREATE TRIGGER BILL_ITEMS_AIUD0 FOR BILL_ITEMS
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION  0 
AS
declare variable current_bill_id integer;
begin
  if (deleting) then
    current_bill_id = old.bill_id;
  else
    current_bill_id = new.bill_id;

  update bill b set
    b.summa = (select sum(Summa) from bill_items b_i where b_i.bill_id = :current_bill_id)
  where b.bill_id = :current_bill_id;

end
^

 /* Trigger: BILL_ITEMS_BI */ 
CREATE TRIGGER BILL_ITEMS_BI FOR BILL_ITEMS
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW.BILL_ITEMS_ID IS NULL) THEN
    NEW.BILL_ITEMS_ID = GEN_ID(GEN_BILL_ITEMS_ID, 1 );
END
^

 /* Trigger: BILL_NUMBER_BI */ 
CREATE TRIGGER BILL_NUMBER_BI FOR BILL
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW.BILL_NUMBER IS NULL) THEN
    NEW.BILL_NUMBER = GEN_ID(GEN_BILL_NUMBER_ID, 1 );
END
^


SET TERM ; ^


Вот.

Теперь заполним все это.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
 /******************************************************************************/ 
 /***          Generated by IBExpert 2004.08.02 17.08.2004 14:39:06          ***/ 
 /******************************************************************************/ 

SET SQL DIALECT  3 ;

SET NAMES WIN1251;

CONNECT 'c:\tst.gdb' USER 'SYSDBA' PASSWORD 'masterkey';

INSERT INTO GOODS ( NAME) VALUES ('Огурцы');
INSERT INTO GOODS ( NAME) VALUES ('Помидоры');
INSERT INTO GOODS ( NAME) VALUES ('Картошка');

COMMIT WORK;

INSERT INTO BILL (MOMENT, SUMMA) VALUES ('2004-08-17 00:15:00',  0 );
INSERT INTO BILL (MOMENT, SUMMA) VALUES ('2004-08-18 00:20:00',  0 );
INSERT INTO BILL (MOMENT, SUMMA) VALUES ('2004-08-19 00:21:00',  0 );

COMMIT WORK;

INSERT INTO BILL_ITEMS (GOODS_ID, BILL_ID, QNT, PRICE) VALUES ( 1 ,  1 ,  1 ,  5 );
INSERT INTO BILL_ITEMS (GOODS_ID, BILL_ID, QNT, PRICE) VALUES ( 2 ,  1 ,  2 ,  7 );
INSERT INTO BILL_ITEMS (GOODS_ID, BILL_ID, QNT, PRICE) VALUES ( 3 ,  1 ,  3 ,  11 );
INSERT INTO BILL_ITEMS (GOODS_ID, BILL_ID, QNT, PRICE) VALUES ( 1 ,  2 ,  4 ,  5 );
INSERT INTO BILL_ITEMS (GOODS_ID, BILL_ID, QNT, PRICE) VALUES ( 2 ,  1 ,  5 ,  11 );

COMMIT WORK;


Ну, вот тебе пример выборки ВСЕХ позиций чеков.

Код: plaintext
1.
2.
select b_i.*, b.moment, g.name from bill_items b_i
  join bill b on (b_i.bill_id = b.bill_id)
  join goods g on (b_i.goods_id = g.goods_id)

А вот выборка СРЕДНИХ значений (суммы) по каждому товару

Код: plaintext
1.
2.
3.
select avg(b_i.summa), g.name from bill_items b_i
  join bill b on (b_i.bill_id = b.bill_id)
  join goods g on (b_i.goods_id = g.goods_id)
 group by g.name, g.goods_id

А вот то же самое за промежуток времени:

Код: plaintext
1.
2.
3.
4.
select avg(b_i.summa), g.name from bill_items b_i
  join bill b on (b_i.bill_id = b.bill_id)
  join goods g on (b_i.goods_id = g.goods_id)
 where b.moment between :From and :To
 group by g.name, g.goods_id

Удачи.
...
Рейтинг: 0 / 0
корзина покупателя
    #32653516
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос непонятен ! :(
Нужен АВС-анализ ?
Товары-спутники т.е. товары, которые часто встречаются в одной покупке ?
...
Рейтинг: 0 / 0
корзина покупателя
    #32656580
leonbn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MV:
Спасибо, но структуры и запросы я и так могу сделать (и сделал).

2 LSV:
Именно так. Буду признателен за любую информацию.
...
Рейтинг: 0 / 0
корзина покупателя
    #32657356
c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Voobshe-to eta infa est' w result glawnoi cassy, wydaetsya pri podwedenii itogow.Basic - barcode.Ne?
...
Рейтинг: 0 / 0
корзина покупателя
    #32658885
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаете, что такое АВС-анализ ? :(
грубо - рейтинг-сортировка по продажам или по прибыли за период:
Группа А обычно ТОП 40% всех продаж
Группа В 40% от оставшихся товаров после А кроме С,Х,0
Группа С 50% от оставшихся товаров после А и В кроме Х,0
Группа 0 все оставшиеся после А, В, С кроме Х
Группа Х товары без продаж

деление довольно условное т.е. "на вкус начальства" :(

Товары-спутники (пиво-чипсы, Хлеб-колбаса, Шампанское-торт, мыло-верёвка) искать непросто ... :)
хотя как правило это не очень-то полезная информация...
...
Рейтинг: 0 / 0
корзина покупателя
    #32674160
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вопрос понять как
LSVТовары-спутники т.е. товары, которые часто встречаются в одной покупке ?
то попробуй, хотя это гм...
1 сделать список наименований для чеков в которых 2 наименования 3, 4,...N
2 если считается что в средей покупке M товаров, то начинаем смотреть с наименований содержащихся в чеках с М наименованиями.
3 Дальше циклами ищем все возможные комбинации, и кол-во данных комбинаций.

комбинация, которая чаще всего встречается, я так понимаю, и будет средняя корзина.

есть еще другой способ, типа Монте-Карло.
зная общее кол-во покупок, и кол-во покупок данного наименования то можно вычислить вероятность любой комбинации... Типа самая вероятная - "Средняя покупка"

но это то что пришло в голову в первые 10 минут
...
Рейтинг: 0 / 0
корзина покупателя
    #32674185
dimonspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типа такого
select t2.goodsid,
gd2.Name,
count(t1.chequeid) as ccc
from Line as t1,Line as t2, goods as gd1,goods as gd2
where t1.chequeid=t2.chequeid and t1.goodsid<>t2.goodsid and
t1.goodsid = gd1.Id and
t2.goodsid = gd2.Id and t1.goodsid = 22236
group by t2.goodsid , gd2.Name
order by ccc desc

Line - строки чеков
Goods - товары
t1.goodsid = 22236 ---конкретный товар
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / корзина покупателя
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]