Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Задача по oracle 10g  [new]
saxarock
Member

Откуда: ЕКБ
Сообщений: 175
Имеется выборка из БД

SELECT DISTINCT sub.castyname "Наименование",
  sub.castynumnal "ИНН",
  sub.Cnastynasty,
  sub.cnastyprizn,
  sub.history,
  sum(nvl (sub.MmrtyRSUM_all_period_dt, 0)) "Сумма ДТ",
  sum(nvl (sub.MmrtyRSUM_all_period_kt, 0)) "Сумма КТ"
from(
SELECT DISTINCT s.castyname ,
  s.castynumnal ,
  a.Cnastynasty,
  a.cnastyprizn,
  MmrtyRSUM_all_period_dt.MmrtyRSUM  MmrtyRSUM_all_period_dt,
  MmrtyRSUM_all_period_kt.MmrtyRSUM  MmrtyRSUM_all_period_kt,
  tr.CbasdfFLAG || ' - ' || tr.dbasdfdate history
FROM xxi.asty s,
xxi."nasty" a ,
(SELECT DISTINCT aa.Cbasdfnasty,
                        DECODE (aa.CbasdfFLAG, 'О', 'Открыт', 'Б', 'Блокирован', 'З', 'Закрыт', 'Ч', 'Частично блокирован', NULL) CbasdfFLAG,
                        aa.dbasdfdate 
                        FROM xxi."basdf" aa 
                         ) tr, 
(SELECT SUM(t.MmrtyRSUM) MmrtyRSUM, t.cmrtynastyd   FROM xxi."mrty" t   
                      WHERE t.DmrtyTRAN BETWEEN to_date('20.03.2017 00.00.00','dd.mm.yyyy hh24.mi.ss') and to_date('17.04.2017 23.59.59','dd.mm.yyyy hh24.mi.ss')   
                      group by t.cmrtynastyd  ) MmrtyRSUM_all_period_dt,
                            
                            
(SELECT SUM(t.MmrtyRSUM) MmrtyRSUM, t.cmrtynastyc   FROM xxi."mrty" t   
            WHERE t.DmrtyTRAN BETWEEN to_date('20.03.2017 00.00.00','dd.mm.yyyy hh24.mi.ss') and to_date('17.04.2017 23.59.59','dd.mm.yyyy hh24.mi.ss')   
             group by t.cmrtynastyc) MmrtyRSUM_all_period_kt  
                         
WHERE 
a.inastyasty = s.iastynum and
tr.Cbasdfnasty = a.cnastynasty and
MmrtyRSUM_all_period_dt.cmrtynastyd(+) = a.Cnastynasty and
MmrtyRSUM_all_period_kt.cmrtynastyc(+) = a.Cnastynasty and
a.IDSMR <> '16'
AND a.InastyBS2 LIKE '40%'
AND a.inastybs2 NOT IN ('40817', '40911', '40821','40820', '40901', '40906', '40912', '40913')
AND s.castynumnal IN ( '6658211146',
'7452139843',
'1832129590')

) sub
group by sub.castyname, sub.castynumnal, sub.history, sub.Cnastynasty,
sub.cnastyprizn
 ;



выводит данные такие

Наименование ИНН Cnastynasty cnastyprizn HISTORY Сумма ДТ Сумма КТ
"йцу" 7452139843 0064160000 О Открыт - 28.03.2017 00:00:00 40 40
"йцу" 7452139843 0162160020 О Открыт - 28.03.2017 00:00:00 0 0
"фыв" 1832129590 0664280001 О Открыт - 03.04.2017 00:00:00 28 180
"вап" 6658211146 0062100001 О Открыт - 21.03.2017 00:00:00 0 0

необходимы данные такого вида

Наименование ИНН Cnastynasty cnastyprizn HISTORY Сумма ДТ Сумма КТ
"йцу" 7452139843 0064160000 *|* 0162160020 О *|* О Открыт - 28.03.2017 00:00:00 *|* Открыт - 28.03.2017 00:00:00 40 40
"фыв" 1832129590 0664280001 О Открыт - 03.04.2017 00:00:00 28 180
"вап" 6658211146 0062100001 О Открыт - 21.03.2017 00:00:00 0 0

Про
listagg () within group (order by )
- знаю, и знаю что в оракл 10g не сработает.
пробовал WM_CONCAT - но на некоторых значениях отваливается.

Подскажите возможно реализовать как-то по другому, не прошу писать код, прошу натолкнуть на мысль.
21 апр 17, 08:41    [20420889]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
Я - Lеft jоin
Guest
saxarock,

Используй меня раз 10 по ИНН и Наименованию
21 апр 17, 08:46    [20420906]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
Elic
Member

Откуда:
Сообщений: 29990
saxarock
возможно реализовать как-то по другому, не прошу писать код, прошу натолкнуть на мысль.
+
------------------------------------------------------------------------------------------
-- ListAgg - эмуляция ListAgg (из 11g) в 10g
---
-- Пример:
--     Util.ListAgg(cast(collect(path order by path) as tp_varchar2_4000_table), ', ') as paths --10g
--   вместо
--     listagg(path, ', ') within group (order by path) as paths                                --11g
---------
function ListAgg(aTable tp_varchar2_4000_table, aSeparator varchar2 := '|') return varchar2;
21 апр 17, 08:47    [20420913]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
saxarock
Member

Откуда: ЕКБ
Сообщений: 175
Elic,

Поделись (если не трудно и бесплатно), если есть реализованная функция.
21 апр 17, 08:53    [20420931]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
Elic
Member

Откуда:
Сообщений: 29990
saxarock
Поделись (если не трудно и бесплатно), если есть реализованная функция.
А как же "не прошу писать код, прошу натолкнуть на мысль" ?
21 апр 17, 09:00    [20420954]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
saxarock
Member

Откуда: ЕКБ
Сообщений: 175
Elic
А как же "не прошу писать код, прошу натолкнуть на мысль" ?


Запамятовал, я же ленивый)
21 апр 17, 09:02    [20420966]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
Anatoly B
Member

Откуда:
Сообщений: 178
saxarock,

погугли ODCIAggregate...
21 апр 17, 09:04    [20420972]     Ответить | Цитировать Сообщить модератору
 Re: Задача по oracle 10g  [new]
Elic
Member

Откуда:
Сообщений: 29990
saxarock
Запамятовал, я же ленивый)
Я бы сказал безмозглый, раз по спецификации не смог написать элементарную реализацию.
+
---------
function ListAgg(aTable tp_varchar2_4000_table, aSeparator varchar2 := '|') return varchar2
is
  fRes varchar2(4000);
begin
  for i in 1 .. aTable.count loop
    fRes := fRes || case when i > 1 then aSeparator end || aTable(i);
  end loop;
  return fRes;
end ListAgg;
21 апр 17, 10:43    [20421320]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить