powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Упрощение запроса (группировка по условиям)
8 сообщений из 8, страница 1 из 1
Упрощение запроса (группировка по условиям)
    #39520388
Alexander Warlord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Возможно ли уменьшить данный запрос и избавиться от UNION'а?

Код: plsql
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.
SELECT
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    'Офисы продаж' AS DEALER_NAME,
    COUNT(ph.MSISDN) AS KOLVO
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND dl.DLR_ID IN (4,5,57,60,94,158,161,214,219,232,233,244,293,309,560,562,590,591)
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM')
UNION ALL
SELECT
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    'Собственные дилеры' AS DEALER_NAME,
    COUNT(ph.MSISDN) AS KOLVO
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND dl.DLR_ID IN (301,302)
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM')
UNION ALL
SELECT
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    'Реализация на Псоу' AS DEALER_NAME,
    COUNT(ph.MSISDN) AS KOLVO
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND dl.DLR_ID IN (561)
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM')
UNION ALL
SELECT
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    'Департамент развития' AS DEALER_NAME,
    COUNT(ph.MSISDN) AS KOLVO
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND (dl.DLR_ID IN (285,677)
    OR dl.DEP_DLR_ID = 285)
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM')
UNION ALL
SELECT
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    'Дилеры' AS DEALER_NAME,
    COUNT(ph.MSISDN) AS KOLVO
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND dl.DLR_ID NOT IN (4,5,57,60,94,158,161,214,219,232,233,244,293,309,560,562,590,591,
    301,302,561,285,677)
    AND (dl.DEP_DLR_ID NOT IN (285) or dl.DEP_DLR_ID IS NULL)
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM')



Пробовал CASE'ом, ругается на группировку..
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520412
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажи как пробовал
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520413
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander WarlordПробовал CASE'ом, ругается на группировку..group by CASE'ом по dl.DLR_ID IN (...) или сделай справочник и добавь джоин.
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520529
Alexander Warlord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183Покажи как пробовал

Вот так:

Код: plsql
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
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    (CASE
        WHEN dl.DLR_ID IN (4,5,57,60,94,158,161,214,219,232,233,244,293,309,560,562,590,591) THEN COUNT(ph.MSISDN) END) AS "Офисы продаж",
    (CASE WHEN dl.DLR_ID IN (301,302) THEN COUNT(ph.MSISDN) END) AS "Собственные дилеры"
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM')



ругается на ct.DLR_ID
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520530
Alexander Warlord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Alexander WarlordПробовал CASE'ом, ругается на группировку..group by CASE'ом по dl.DLR_ID IN (...) или сделай справочник и добавь джоин.
Попробую так..
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520570
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Warlord,

Попробуй так:
Код: plsql
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.
SELECT
    TRUNC(s.ACTIVATION_DATE,'MM') AS ACTIVATION_DATE,
    CASE
       WHEN dl.DLR_ID IN (4,5,57,60,94,158,161,214,219,232,233,244,293,309,560,562,590,591) THEN 'Офисы продаж'
       WHEN dl.DLR_ID IN (301,302) Then 'Собственные дилеры'
--...........
END AS DEALER_NAME ,
    COUNT(ph.MSISDN) AS "Собственные дилеры"
FROM
    SUBS_HISTORY sh,
    TARIFF_PLAN tp,
    CONTRACT ct,
    DEALER dl,
    PHONE ph,
    SUBSCRIBER s
WHERE
    s.SUBS_ID = sh.SUBS_ID
    AND ph.PHONE_ID = sh.PHONE_ID
    AND sh.TRPL_ID = tp.TRPL_ID
    AND ct.CLNT_ID = sh.CLNT_ID
    AND ct.DLR_ID = dl.DLR_ID
    AND s.ACTIVATION_DATE IS NOT NULL
    AND s.ACTIVATION_DATE BETWEEN sh.STIME AND sh.ETIME - 1/86400
    AND s.ACTIVATION_DATE BETWEEN ct.STIME AND ct.ETIME - 1/86400
    AND s.ACTIVATION_DATE >= TRUNC(:DATE1)
    AND s.ACTIVATION_DATE <= TRUNC(:DATE2) + 1 - 1 / 86400
GROUP BY TRUNC(s.ACTIVATION_DATE,'MM'),
    CASE
       WHEN dl.DLR_ID IN (4,5,57,60,94,158,161,214,219,232,233,244,293,309,560,562,590,591) THEN 'Офисы продаж'
       WHEN dl.DLR_ID IN (301,302) Then 'Собственные дилеры'
--...........
END
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520583
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Warlord,

Только следи, твои строки разбиты на условия по 2 полям dl.DLR_ID и dl.DEP_DLR_ID.
Если ты перепишешь на 1 селект, то в нем 1 строка считается 1 раз, а через UNION может считаться много раз

пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as (select 4 DLR_ID, 285 DEP_DLR_ID from dual)

select count(*) from t where DLR_ID = 4
union all
select count(*) from t where DEP_DLR_ID = 285

count(*)
1
1
...
Рейтинг: 0 / 0
Упрощение запроса (группировка по условиям)
    #39520599
Alexander Warlord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это да, понимаю. Большое спасибо за помощь!)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Упрощение запроса (группировка по условиям)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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