Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка даты в групповом запросе / 19 сообщений из 19, страница 1 из 1
06.01.2020, 08:41
    #39911088
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Здравствуйте. Как можно проверить еще и дату в групповом запросе? Ругается: ORA-00979: это не GROUP BY выражение на dtj_reestr.date_order.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select dtj_contragents.contragent_name as namen, dtj_reestr.consignor_id as kod_i,
(CASE 
WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass))) IS NOT NULL
and dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY')
THEN (SUM(dtj_reestr.goods_mass)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass)))
END) as "ВСЕГО"

from dtj_contragents
left join dtj_reestr on dtj_reestr.consignor_id = dtj_contragents.contragent_code
and dtj_reestr.control_date between to_date('01.01.2018','dd.mm.yyyy')and to_date('30.11.2019','dd.mm.yyyy')
group by dtj_contragents.contragent_name, dtj_reestr.consignor_id
order by namen;
...
Рейтинг: 0 / 0
06.01.2020, 08:56
    #39911091
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin,

у вас в группировочную строку могут попадать строки с разными датами
групповой запрос не знает, чего вы конкретно хотите от этих дат
...
Рейтинг: 0 / 0
06.01.2020, 11:11
    #39911102
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
andreymx,

Вот и вопрос, как отобрать записи < 01.01.2019?
...
Рейтинг: 0 / 0
06.01.2020, 11:27
    #39911108
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin
Вот и вопрос
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
marlin
как отобрать записи < 01.01.2019?
RTFM where
...
Рейтинг: 0 / 0
06.01.2020, 12:16
    #39911115
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
нужно условие даты внутри CASE, потому что условий очень много. Обрезано для примера:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select dtj_contragents.contragent_name as namen, dtj_reestr.consignor_id as kod_i,
(CASE 
WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass))) IS NOT NULL
AND dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY')
THEN (SUM(dtj_reestr.goods_mass)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass)))

WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.mass_round))) IS NOT NULL
AND dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY')
THEN (SUM(dtj_reestr.mass_round)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.mass_round)))
END) as "ВСЕГО"

from dtj_contragents
left join dtj_reestr on dtj_reestr.consignor_id = dtj_contragents.contragent_code
and dtj_reestr.control_date between to_date('01.01.2018','dd.mm.yyyy')and to_date('30.11.2019','dd.mm.yyyy')
group by dtj_contragents.contragent_name, dtj_reestr.consignor_id
order by namen;
...
Рейтинг: 0 / 0
06.01.2020, 12:36
    #39911119
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
А кому-то "нужно", чтобы в зависимости от case менялось условие where.

Можно эти "нужно" рисовать в зависимости от возможностей синтаксиса.

Например, case вынести на select уровнем выше.
...
Рейтинг: 0 / 0
08.01.2020, 10:05
    #39911483
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin
нужно условие даты внутри CASE, потому что условий очень много. Обрезано для примера:
...

логика странная

прикиньте что условие "внутри CASE" выполняется сразу для 2018 и 2019
для какого года у Вас будет "ВСЕГО"?

скорее ввсего Вам надо
group by dtj_contragents.contragent_name, dtj_reestr.consignor_id.to_char(dtj_reestr.date_order,'yyyy')

.....
stax
...
Рейтинг: 0 / 0
08.01.2020, 11:56
    #39911512
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Stax,

период может быть задан любой, но если date_order<01.01.2019 используется поле goods_mass, а если > 31.12.2018, то поле mass_round.
Можно было бы вот таким образом посчитать и сложить итог, но этот вариант ошибок не дает, но и сумму не считает...
Код: 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 dtj_contragents.contragent_name as namen, dtj_reestr.consignor_id as kod_i,
   (select 
         (CASE
          WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
          AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass))) IS NOT NULL
          THEN (SUM(dtj_reestr.goods_mass)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass)))
          END) as bb
          from dtj_reestr
          where date_order < to_date('01.01.2019','DD.MM.YYYY')
    ) as "ВСЕГО 2019",
    (select 
         (CASE
          WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
          AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.mass_round))) IS NOT NULL
          THEN (SUM(dtj_reestr.mass_round)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.mass_round)))
          END) as aa
          from dtj_reestr
          where date_order > to_date('31.12.2018','DD.MM.YYYY')
    ) as "ВСЕГО 2018"
from dtj_contragents
left join dtj_reestr on dtj_reestr.consignor_id = dtj_contragents.contragent_code
and dtj_reestr.control_date between to_date('01.01.2018','dd.mm.yyyy')and to_date('30.11.2019','dd.mm.yyyy')
group by dtj_contragents.contragent_name, dtj_reestr.consignor_id
order by namen;
...
Рейтинг: 0 / 0
08.01.2020, 12:24
    #39911519
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin
Stax,

период может быть задан любой, но если date_order<01.01.2019 используется поле goods_mass, а если > 31.12.2018, то поле mass_round.
Можно было бы вот таким образом посчитать и сложить итог, но этот вариант ошибок не дает, но и сумму не считает...

так у Вас ДВА поля ВСЕГО (ето совсем другой коленкор, аля unpivot)

могу ошибится со скобками
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select dtj_contragents.contragent_name as namen, dtj_reestr.consignor_id as kod_i

,CASE WHEN dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY') then 
 (CASE 
  WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
  AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass))) IS NOT NULL
  THEN (SUM(dtj_reestr.goods_mass)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.goods_mass))) END)
END)
as "ВСЕГО 2018?"

,CASE WHEN dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY') then
 (CASE
  WHEN (sum(decode(dtj_reestr.good_group_id, 17, dtj_reestr.kontainer_mass)))IS NULL
  AND (sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.mass_round))) IS NOT NULL
  THEN (SUM(dtj_reestr.mass_round)-sum(decode(dtj_reestr.good_group_id, 18, dtj_reestr.mass_round))) END) 
END)
as "ВСЕГО 2019?"

from dtj_contragents
left join dtj_reestr on dtj_reestr.consignor_id = dtj_contragents.contragent_code
and dtj_reestr.control_date between to_date('01.01.2018','dd.mm.yyyy')and to_date('30.11.2019','dd.mm.yyyy')
group by dtj_contragents.contragent_name, dtj_reestr.consignor_id
order by namen;




....
stax
...
Рейтинг: 0 / 0
08.01.2020, 12:46
    #39911523
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Stax,

ошибка: ORA-00979: выражение не является выражением GROUP BY
...
Рейтинг: 0 / 0
08.01.2020, 12:48
    #39911524
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Станислав, не надоело стелиться перед теми, кто не в состоянии ни сформулировать проблему, ни самостоятельно думать?
...
Рейтинг: 0 / 0
08.01.2020, 13:02
    #39911528
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Станислав,

спасибо тебе, что помогаешь... Много было времени потрачено на запрос, прежде чем опубликовать его на форуме.

Elic, а ты наверное помогаешь, только тем ..., правильно - никому... Потому что сам не в состоянии понимать формулировок вопросов.
...
Рейтинг: 0 / 0
08.01.2020, 13:13
    #39911534
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin
Stax,

ошибка: ORA-00979: выражение не является выражением GROUP BY

моя ошибка
не там case влепил

минуточку, набью данные

.....
stax
...
Рейтинг: 0 / 0
08.01.2020, 13:13
    #39911535
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin
Потому что сам не в состоянии понимать формулировок вопросов.
Ламер, не воинствуй.
...
Рейтинг: 0 / 0
08.01.2020, 13:14
    #39911538
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Elic,

нет

тем более я ошибся с case

....
stax
...
Рейтинг: 0 / 0
08.01.2020, 13:17
    #39911542
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Stax
тем более я ошибся с case
Может ещё и компенсацию ему выплатишь?
...
Рейтинг: 0 / 0
08.01.2020, 13:21
    #39911546
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Elic
Stax
тем более я ошибся с case
Может ещё и компенсацию ему выплатишь?


Это ты для меня сделаешь.
...
Рейтинг: 0 / 0
08.01.2020, 14:27
    #39911568
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
marlin,

набрал (перестраховываясь мож даже немного лишнего влепил в THEN SUM(CASE ...)

Код: 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.
with dtj_contragents(contragent_code,contragent_name) as (
 select 1,'a' from dual union all
 select 2,'b' from dual)
,dtj_reestr(consignor_id,control_date,mass_round,good_group_id,date_order,kontainer_mass,goods_mass) as (
 select 1,date '2018-01-05',100,18,date '2018-01-05',10,1 from dual union all
 select 1,date '2018-02-05',200,20,date '2018-02-05',20,2 from dual union all
 select 1,date '2018-02-06',200,20,date '2018-02-06',20,3 from dual union all
 select 1,date '2019-02-05',300,18,date '2019-02-05',20,4 from dual union all
 select 1,date '2019-03-05',400,22,date '2019-03-05',20,5 from dual union all
 select 2,date '2019-01-06',500,17,date '2019-01-05',30,6 from dual)
select dtj_contragents.contragent_name as namen, dtj_reestr.consignor_id as kod_i,
CASE 
  WHEN sum(CASE WHEN dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY') 
                  and dtj_reestr.good_group_id=17 then dtj_reestr.kontainer_mass end ) IS NULL
   AND sum(CASE WHEN dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY') 
                  and dtj_reestr.good_group_id=18 then dtj_reestr.goods_mass end ) IS NOT NULL
--AND dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY')
THEN SUM(CASE WHEN dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY') then dtj_reestr.goods_mass end)
    -sum(CASE WHEN dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY') and dtj_reestr.good_group_id=18 then dtj_reestr.goods_mass end) end
"ВСЕГО 2018"
,
CASE 
  WHEN sum(CASE WHEN dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY')
                  and dtj_reestr.good_group_id=17 then dtj_reestr.kontainer_mass end ) IS NULL
   AND sum(CASE WHEN dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY')
                  and dtj_reestr.good_group_id=18 then dtj_reestr.goods_mass end ) IS NOT NULL
--AND dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY')
THEN SUM(CASE WHEN dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY') then dtj_reestr.dtj_reestr.mass_round end)
     -sum(CASE WHEN dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY') and dtj_reestr.good_group_id=18 then dtj_reestr.dtj_reestr.mass_round end) end
"ВСЕГО 2019"
from dtj_contragents
left join dtj_reestr on dtj_reestr.consignor_id = dtj_contragents.contragent_code
and dtj_reestr.control_date between to_date('01.01.2018','dd.mm.yyyy')and to_date('30.11.2019','dd.mm.yyyy')
group by dtj_contragents.contragent_name, dtj_reestr.consignor_id
order by namen
/
SQL> /

N      KOD_I ВСЕГО 2018 ВСЕГО 2019
- ---------- ---------- ----------
a          1          5        400
b          2



условие надо прятать под групповую ф-цию

но!
я не совсем понимаю задачу
в том как я ее себе представил я б
делал по совету 22053988

в подзапрос спрятал and dtj_reestr.date_order
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
... from (select 
...
,case when dtj_reestr.date_order < to_date('01.01.2019','DD.MM.YYYY') then goods_mass end s2018
,case when dtj_reestr.date_order > to_date('31.12.2018','DD.MM.YYYY') then mass_round end s2019
...
from dtj_contragents
left join dtj_reestr on dtj_reestr.consignor_id = dtj_contragents.contragent_code
and dtj_reestr.control_date between to_date('01.01.2018','dd.mm.yyyy')and to_date('30.11.2019','dd.mm.yyyy')
)



а в запросе работал с етими полями

....
stax
...
Рейтинг: 0 / 0
09.01.2020, 13:03
    #39911955
marlin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка даты в групповом запросе
Stax,

Спасибо большое. Здорово выручил. Запрос отлично работает.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка даты в групповом запросе / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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