Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Помогите с запросом - отчет - выполнение заказов поставщиком : Программирование

18.04.2024 21:28


15.11.2010 09:14
konst
 
Написал отчет - выполнение заказов поставщиком...
в принципе если соблюдается правило 1 заказ - 1 приходка все работает отлично... но если на основании 1 заказа создано 2 накладные возникает проблема - как в одну строку вывести результаты следующего запроса:

SELECT b.basedoctype, b.baseid, b.doctype, b.ID
FROM supermag.smcommonbases b
WHERE b.doctype = 'WI'
AND b.basedoctype = 'OR'
AND b.baseid IN (
SELECT a.ID
FROM supermag.smdocuments a
WHERE a.doctype = 'OR'
AND a.createdat BETWEEN TO_DATE ('08.11.2010', 'DD.MM.YYYY')
AND TO_DATE ('14.11.2010', 'DD.MM.YYYY')
AND a.clientindex = '1490')

результат:
OR ЗПЦП001790 WI ПНП10005458
OR ЗПЦП001790 WI ПНП10005459
OR ЗПЦП001791 WI ПНП06010597
OR ЗПЦП001792 WI ПНП02003571
OR ЗПЦП001793 WI ПНП05008819
OR ЗПЦП001793 WI ПНП05008740
OR ЗПЦП001794 WI ПНП01011782

а хотелось бы получить:
OR ЗПЦП001790 WI ПНП10005458, ПНП10005459
OR ЗПЦП001791 WI ПНП06010597
OR ЗПЦП001792 WI ПНП02003571
OR ЗПЦП001793 WI ПНП05008819, ПНП05008740
OR ЗПЦП001794 WI ПНП01011782
15.11.2010 09:17
OlegON
 
Думается, что без PL/SQL c курсором тут не обойтись.
15.11.2010 18:45
vdm
 
Лень вникать в данный случай, но думаю переделать будет несложно.
Это задача по моему из faq на sql.ru

Пара моих скриптов скриптов на эту тему

Код:
-- Список артикулов заказа с выводом всех ШК для артикула в одной строке
-- через аналитические ф-ии (в 1С 7.7 через ADODB почему-то не работает sys_xmlagg)
-- Количество по спецификации суммируется

SELECT article, TO_CHAR(quantity) quantity, shortname, ltrim(sys_connect_by_path(barcode, ';'), ';') as bar
  FROM
  ( SELECT  c.article, c.quantity, c.shortname, b.barcode,
            row_number() over (partition by c.article order by b.barcode) as id,
            count(*) over (partition by c.article order by b.barcode ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as cnt
      FROM
        (  SELECT a.article, SUM(s.quantity) quantity, a.shortname
             FROM supermag.smspec s, supermag.smdocuments d, supermag.smcard a
            WHERE d.ID = 'ЗП40232' AND d.doctype = 'OR' AND d.ID = s.docid AND d.doctype = s.doctype
              AND s.article = a.article
         GROUP BY a.article, a.shortname   
        ) c, supermag.smstoreunits b
     WHERE c.article=b.article(+)
  )      
 WHERE id = cnt
 START WITH id = 1
 CONNECT BY id = prior id + 1 and article = prior article
;
Код:
    -- Возврат количества и списка артикулов в спецификации без признака 'грузить в кассу'
    select count(*), sys_xmlagg(xmlelement(col, sc.article ||', ')).extract('/ROWSET/COL/text()').getclobval()  
      from supermag.smspec sp, supermag.smcard sc
     where sp.doctype = :DocType and sp.docid = :ID 
       and sp.article=sc.article and sc.cashload=0;
Вроде оба способа требуют 9-й оракл.
16.11.2010 09:11
konst
 
может кому пригодится... вот что получилось:
Код:
SELECT     basedoctype, baseid, doctype,
           LTRIM (SYS_CONNECT_BY_PATH (ID, ', '), ',') AS pn
      FROM (SELECT b.basedoctype, b.baseid, b.doctype, b.ID,
                   ROW_NUMBER () OVER (PARTITION BY b.baseid ORDER BY b.ID)
                                                                         AS n,
                   COUNT (*) OVER (PARTITION BY b.baseid ORDER BY b.ID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                                                                       AS cnt
              FROM supermag.smcommonbases b
             WHERE b.doctype = 'WI'
               AND b.basedoctype = 'OR'
               AND b.baseid IN (
                      SELECT a.ID
                        FROM supermag.smdocuments a
                       WHERE a.doctype = 'OR'
                         AND a.createdat BETWEEN TO_DATE ('08.11.2010',
                                                          'DD.MM.YYYY'
                                                         )
                                             AND TO_DATE ('14.11.2010',
                                                          'DD.MM.YYYY'
                                                         )
                         AND a.clientindex = '1490'))
     WHERE n = cnt
START WITH n = 1
CONNECT BY n = PRIOR n + 1 AND baseid = PRIOR baseid;
Результат:
OR ЗПП03013255 WI ПНП03009414
OR ЗПЦП001790 WI ПНП10005458, ПНП10005459
OR ЗПЦП001791 WI ПНП06010597, ПНП06010687
OR ЗПЦП001792 WI ПНП02003571
OR ЗПЦП001793 WI ПНП05008740, ПНП05008819
OR ЗПЦП001794 WI ПНП01011707, ПНП01011782
OR ЗПЦП001795 WI ПНП08008754
OR ЗПЦП001796 WI ПНП04009402
16.11.2010 09:47
AirAir
 
Вот так работает!

Select
basedoctype,
BASEID,
DOCTYPE,
MAX(DECODE(rec,1,ID,null)) first,
MAX(DECODE(rec,2,ID,null)) second

FROM(
Select smcommonbases.basedoctype,
smcommonbases.BASEID,
smcommonbases.DOCTYPE,
smcommonbases.ID,
row_number() over (partition by smcommonbases.BASEID order by smcommonbases.ID) rec

From
supermag.smdocuments,
supermag.smcommonbases

WHERE
smdocuments.DOCTYPE = smcommonbases.DOCTYPE AND
smdocuments.ID = smcommonbases.ID AND
smdocuments.createdat between '10-10-2010' and '10-10-2010' AND
smcommonbases.BASEDOCTYPE = 'OR'
)

Group by
basedoctype,
BASEID,
DOCTYPE
16.11.2010 09:49
AirAir
 
Надо только еще добавить отбор по поставщику
Часовой пояс GMT +3, время: 21:28.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.