Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / На сколько правильно так делать? / 2 сообщений из 2, страница 1 из 1
13.11.2018, 12:46
    #39732361
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На сколько правильно так делать?
Вобщем промучался я с отчетной формой почти месяц. В итоге ничего другого как временные таблицы не пришло в голову. Хотелось решить задачу исключительно MYSQL, не привлекая программную часть (переборы). Получилась вот такая серия запросов. Я почти уверен, что это можно сделать и без временных таблиц с кучей вложенных select-ов, но к сожалению не имею достаточно знаний.
Вопрос, костыль или нет? Если поможете переделать, буду рад.


Код: sql
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.
142.
143.
144.
145.
DROP TABLE IF EXISTS treatment.reports_template;
CREATE TABLE treatment.reports_template (
  group_parent int(11) DEFAULT NULL,
  groupid int(11) DEFAULT NULL,
  groupid2 int(11) DEFAULT NULL,
  torep int(11) DEFAULT NULL,
  KODnom varchar(10) DEFAULT NULL,
  NAIM varchar(255) DEFAULT NULL,
  all0 int(11) DEFAULT NULL,
  all1 int(11) DEFAULT NULL,
  ud0 int(11) DEFAULT NULL,
  view1 int(11) DEFAULT NULL,
  ud1 int(11) DEFAULT NULL,
  raz0 int(11) DEFAULT NULL,
  raz1 int(11) DEFAULT NULL,
  otk0 int(11) DEFAULT NULL,
  otk1 int(11) DEFAULT NULL,
  view0 int(11) DEFAULT NULL
)
ENGINE = INNODB
AVG_ROW_LENGTH = 496
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

#Создание каркаса отчета с первоначальными суммами
INSERT INTO reports_template
(select kodvopr.group_parent AS group_parent,
kodvopr.groupid AS groupid,
kodvopr.groupid2 AS groupid2,
kodvopr.torep AS torep,
kodvopr.KODnom AS KODnom,
kodvopr.NAIM as NAIM,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') then 1 else 0 end) AS All0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') then 1 else 0 end) AS All1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'УДОВЛЕТВОРЕНО') then 1 else 0 end) AS ud0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'УДОВЛЕТВОРЕНО') then 1 else 0 end) As ud1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'РАЗЪЯСНЕНО') then 1 else 0 end) AS raz0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'РАЗЪЯСНЕНО') then 1 else 0 end) As raz1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'ОТКАЗАHО') then 1 else 0 end) As otk0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'ОТКАЗАHО') then 1 else 0 end) AS otk1, 
sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (control=1) AND (resultview='')  then 1 else 0 end)AS view0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (control=1) AND (resultview='') then 1 else 0 end) AS view1
From kodvopr 
LEFT JOIN register ON kodvopr.KODnom = register.themeid
 group by KODnom ORDER BY kodvopr.KOD11,kodvopr.groupid);


DROP TABLE IF EXISTS treatment.reports_template2;
CREATE TABLE treatment.reports_template2 (
  group_parent int(11) DEFAULT NULL,
  groupid int(11) DEFAULT NULL,
  groupid2 int(11) DEFAULT NULL,
  torep int(11) DEFAULT NULL,
  KODnom varchar(10) DEFAULT NULL,
  all0 int(11) DEFAULT NULL,
  all1 int(11) DEFAULT NULL,
  ud0 int(11) DEFAULT NULL,
  view1 int(11) DEFAULT NULL,
  ud1 int(11) DEFAULT NULL,
  raz0 int(11) DEFAULT NULL,
  raz1 int(11) DEFAULT NULL,
  otk0 int(11) DEFAULT NULL,
  otk1 int(11) DEFAULT NULL,
  view0 int(11) DEFAULT NULL
)
ENGINE = INNODB
AVG_ROW_LENGTH = 496
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

# запись результатов сумм по группам первой вложенности
INSERT INTO reports_template2
(select kodvopr.group_parent AS group_parent,
kodvopr.groupid AS groupid,
kodvopr.groupid2 AS groupid2,
kodvopr.torep AS torep,
kodvopr.KODnom AS KODnom,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') then 1 else 0 end) AS All0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') then 1 else 0 end) AS All1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'УДОВЛЕТВОРЕНО') then 1 else 0 end) AS ud0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'УДОВЛЕТВОРЕНО') then 1 else 0 end) As ud1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'РАЗЪЯСНЕНО') then 1 else 0 end) AS raz0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'РАЗЪЯСНЕНО') then 1 else 0 end) As raz1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'ОТКАЗАHО') then 1 else 0 end) As otk0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'ОТКАЗАHО') then 1 else 0 end) AS otk1, 
sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (control=1) AND (resultview='')  then 1 else 0 end)AS view0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (control=1) AND (resultview='') then 1 else 0 end) AS view1
From kodvopr 
LEFT JOIN register ON kodvopr.KODnom = register.themeid
group by groupid ORDER BY kodvopr.KOD11,kodvopr.groupid);

# запись сумм первой вложенности в таблицу отчета
UPDATE reports_template,reports_template2 
  SET 
  reports_template.all0=reports_template2.All0,
  reports_template.all1=reports_template2.All1,
  reports_template.ud0=reports_template2.ud0,
  reports_template.ud1=reports_template2.ud1,
  reports_template.view0=reports_template2.view0,
  reports_template.view1=reports_template2.view1,
  reports_template.raz0=reports_template2.raz0,
  reports_template.raz1=reports_template2.raz1,
  reports_template.otk0=reports_template2.otk0,
  reports_template.otk1=reports_template2.otk1
WHERE (reports_template.groupid =reports_template2.groupid  AND reports_template.torep=0);


TRUNCATE TABLE reports_template2;

# запись результатов сумм по группам второй вложенности
INSERT INTO reports_template2
(select kodvopr.group_parent AS group_parent,
kodvopr.groupid AS groupid,
kodvopr.groupid2 AS groupid2,
kodvopr.torep AS torep,
kodvopr.KODnom AS KODnom,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') then 1 else 0 end) AS All0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') then 1 else 0 end) AS All1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'УДОВЛЕТВОРЕНО') then 1 else 0 end) AS ud0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'УДОВЛЕТВОРЕНО') then 1 else 0 end) As ud1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'РАЗЪЯСНЕНО') then 1 else 0 end) AS raz0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'РАЗЪЯСНЕНО') then 1 else 0 end) As raz1,
 sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (resultview = 'ОТКАЗАHО') then 1 else 0 end) As otk0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (resultview = 'ОТКАЗАHО') then 1 else 0 end) AS otk1, 
sum(case when (datecreate between '2018-01-01' AND '2018-10-09') AND (control=1) AND (resultview='')  then 1 else 0 end)AS view0,
 sum(case when (datecreate between '2017-01-01' AND '2017-10-09') AND (control=1) AND (resultview='') then 1 else 0 end) AS view1
From kodvopr 
LEFT JOIN register ON kodvopr.KODnom = register.themeid
group by group_parent ORDER BY kodvopr.KOD11,kodvopr.groupid);


# запись сумм второй вложенности в таблицу отчета
UPDATE reports_template,reports_template2 
  SET 
  reports_template.all0=reports_template2.All0,
  reports_template.all1=reports_template2.All1,
  reports_template.ud0=reports_template2.ud0,
  reports_template.ud1=reports_template2.ud1,
  reports_template.view0=reports_template2.view0,
  reports_template.view1=reports_template2.view1,
  reports_template.raz0=reports_template2.raz0,
  reports_template.raz1=reports_template2.raz1,
  reports_template.otk0=reports_template2.otk0,
  reports_template.otk1=reports_template2.otk1
WHERE (reports_template.group_parent=reports_template.groupid2 AND reports_template.torep=0);


Далее после вывода отчета 2 таблицы дропаются.
...
Рейтинг: 0 / 0
13.11.2018, 16:25
    #39732550
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На сколько правильно так делать?
1) Скопируйте свой код (только создание и заполнение) на любой fiddle (скажем, https://dbfiddle.uk или https://www.db-fiddle.com) и дайте ссылку на него. Заодно убедитесь, что в таблицы попадают верные значения. Удалите из структур ненужные для вопроса поля.
2) Опишите задачу. Полно, чётко и подробно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / На сколько правильно так делать? / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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