powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ЗАПРОС
2 сообщений из 2, страница 1 из 1
ЗАПРОС
    #33223255
Белка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите , пожалуйста мне с запросом; я новичок, разбираться самой очень сложно....
"Eсть таблица категорий товара.
create table category (catid number primary key enable, -- ключ
par_catid number references category, -- ссылка на родительскую категорию
name varchar2(300), -- наименование категории
descr varchar2(2000), -- описание
cdate date -- дата создания
);
Есть таблица товаров.
create table goods (gid number primary key enable, -- ключ
cat number references category, -- ссылка на категорию
name varchar2(300), -- наименование товара
descr varchar2(2000), -- описание
unit number references cargo, -- единица измерения
loc number references place, -- место хранения
resp number references corp, -- ответственный за сопровождение
);
Есть таблица движения товаров.
create table moves (gd number references goods, -- товар
mdate date, -- дата операции
inout varchar2(1) default '+', -- приход/расход
amount number, -- количество
price number -- цена
);
Требуется оформить вывод в таком виде
_______________
Категория уровня1||Суммарная стоимость прихода||Суммарная стоимость расхода
...
Категория уровняN||Суммарная стоимость прихода||Суммарная стоимость расхода
Товар 1 категории уровняN|Суммарное количество прихода|Суммарная стоимость прихода|Суммарное количество расхода|Суммарная стоимость расхода| Остаток товара
...
Товар m категории уровняN|Суммарное количество прихода|Суммарная стоимость прихода|Суммарное количество расхода|Суммарная стоимость расхода| Остаток товара

Все суммарные значения подсчитываются для каждой категории с учетом иерархии.
...
Рейтинг: 0 / 0
ЗАПРОС
    #33224247
max(id)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Белка. Какая версия MySQL у вас? Фиксированое ли число N (уровни вложенности категорий)? Товары привязываются только к категории нижнего уровня или любого? Если версия поддерживает подзапросы (выше 4.3 помоему, точно не помню) и фиксированное число N, а товары только в категориях нижнего уровня, то можно попробовать что-нбуть типа этого :
Код: 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.
select tl1.n1 as name,
       tl1.id1 as id,
       tl1.id1 as pid,
       null as p2id,
        1  as lvl,
       null as amount_in, 
       null as amount_out, 
       sum(cst_in) as cost_in, 
       sum(cst_out) as cost_out 
from
(
select l1.name as n1,
         l1.catid as id1, 
         l2.name as n2, 
         l2.catid as id2,
         l3.name as n3, 
         l3.gid as id3,         
         sum(ifnull(if(m.inout='+',m.amount, 0 ), 0 )) as amnt_in, 
         sum(ifnull(if(m.inout='-',m.amount, 0 ), 0 )) as amnt_out, 
         sum(ifnull(if(m.inout='+',m.amount*m.price, 0 ), 0 )) as cst_in, 
         sum(ifnull(if(m.inout='-',m.amount*m.price, 0 ), 0 )) as cst_out 
  from category as l1 
         left join
       category as l2 on l1.catid = l2.par_catid
         left join
       goods as l3 on l2.catid = l3.cat
         left join 
       moves as m on m.gd = l3.gid
  where l1.par_catid is null
  group by l1.name,
           l1.catid, 
           l2.name,
           l2.catid, 
           l3.name,
           l3.gid
) tl1
group by  1 , null, tl1.id, tl1.n1

union all

select tl2.n2 as name,
       tl2.id2 as id,
       tl2.id1 as pid,
       t12.id2 as p2id,
        2  as lvl,
       null as amount_in, 
       null as amount_out, 
       sum(cst_in) as cost_in, 
       sum(cst_out) as cost_out 
from
(
  select l1.name as n1,
         l1.catid as id1, 
         l2.name as n2, 
         l2.catid as id2,
         l3.name as n3, 
         l3.gid as id3,         
         sum(ifnull(if(m.inout='+',m.amount, 0 ), 0 )) as amnt_in, 
         sum(ifnull(if(m.inout='-',m.amount, 0 ), 0 )) as amnt_out, 
         sum(ifnull(if(m.inout='+',m.amount*m.price, 0 ), 0 )) as cst_in, 
         sum(ifnull(if(m.inout='-',m.amount*m.price, 0 ), 0 )) as cst_out 
  from category as l1 
         left join
       category as l2 on l1.catid = l2.par_catid
         left join
       goods as l3 on l2.catid = l3.cat
         left join 
       moves as m on m.gd = l3.gid
  where l1.par_catid is null
  group by l1.name,
           l1.catid, 
           l2.name,
           l2.catid, 
           l3.name,
           l3.gid
) tl2
group by  2 , null, tl2.n2, tl2.id2, tl2.id1

union all

select tl3.n3 as name,
       tl3.id3 as id,
       tl3.id1 as pid,
       t13.id2 as p2id,
        3  as lvl,
       sum(amnt_in) as amount_in, 
       sum(amnt_out) as amount_out, 
       sum(cst_in) as cost_in, 
       sum(cst_out) as cost_out 
from
(
  select l1.name as n1,
         l1.catid as id1, 
         l2.name as n2, 
         l2.catid as id2,
         l3.name as n3, 
         l3.gid as id3,         
         sum(ifnull(if(m.inout='+',m.amount, 0 ), 0 )) as amnt_in, 
         sum(ifnull(if(m.inout='-',m.amount, 0 ), 0 )) as amnt_out, 
         sum(ifnull(if(m.inout='+',m.amount*m.price, 0 ), 0 )) as cst_in, 
         sum(ifnull(if(m.inout='-',m.amount*m.price, 0 ), 0 )) as cst_out 
  from category as l1 
         left join
       category as l2 on l1.catid = l2.par_catid
         left join
       goods as l3 on l2.catid = l3.cat
         left join 
       moves as m on m.gd = l3.gid
  where l1.par_catid is null
  group by l1.name,
           l1.catid, 
           l2.name,
           l2.catid, 
           l3.name,
           l3.gid
) tl3
group by  3 , null, tl3.n3, tl3.id1, tl3.id2, tl3.id1
order by pid, p2id, lvl, name
Это для N=2.
К сожалению не было возможности проверить. Если будет работать то чертовски медленно ;-)) Но задачу решитает и только SQL-ем;-))
Можно взять только эту часть
Код: 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.
select l1.name as n1,
         l1.catid as id1, 
         l2.name as n2, 
         l2.catid as id2,
         l3.name as n3, 
         l3.gid as id3,         
         sum(ifnull(if(m.inout='+',m.amount, 0 ), 0 )) as amnt_in, 
         sum(ifnull(if(m.inout='-',m.amount, 0 ), 0 )) as amnt_out, 
         sum(ifnull(if(m.inout='+',m.amount*m.price, 0 ), 0 )) as cst_in, 
         sum(ifnull(if(m.inout='-',m.amount*m.price, 0 ), 0 )) as cst_out 
  from category as l1 
         left join
       category as l2 on l1.catid = l2.par_catid
         left join
       goods as l3 on l2.catid = l3.cat
         left join 
       moves as m on m.gd = l3.gid
  where l1.par_catid is null
  group by l1.name,
           l1.catid, 
           l2.name,
           l2.catid, 
           l3.name,
           l3.gid
а остальное сделать на клиенте.
P.S. Я еще сам учусь так что могу где-нибуть ошибится, так что не воспринимай это как готовое решение.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ЗАПРОС
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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