powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проверка даты в групповом запросе
19 сообщений из 19, страница 1 из 1
Проверка даты в групповом запросе
    #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
Проверка даты в групповом запросе
    #39911091
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marlin,

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

Вот и вопрос, как отобрать записи < 01.01.2019?
...
Рейтинг: 0 / 0
Проверка даты в групповом запросе
    #39911108
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marlin
Вот и вопрос
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
marlin
как отобрать записи < 01.01.2019?
RTFM where
...
Рейтинг: 0 / 0
Проверка даты в групповом запросе
    #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
Проверка даты в групповом запросе
    #39911119
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кому-то "нужно", чтобы в зависимости от case менялось условие where.

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

Например, case вынести на select уровнем выше.
...
Рейтинг: 0 / 0
Проверка даты в групповом запросе
    #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
Проверка даты в групповом запросе
    #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
Проверка даты в групповом запросе
    #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
Проверка даты в групповом запросе
    #39911523
marlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

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

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

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

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

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

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

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

нет

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

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


Это ты для меня сделаешь.
...
Рейтинг: 0 / 0
Проверка даты в групповом запросе
    #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
Проверка даты в групповом запросе
    #39911955
marlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

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


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