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

Откуда: Москва
Сообщений: 16
Есть количество отгружаемого товара( id=код) ежедневно и признак дня недели:
дата день недели код кол
01.01.2006 0 34 435
02.01.2006 1 35 345
03.01.2006 2 36 334
04.01.2006 3 37 768
05.01.2006 4 35 79
06.01.2006 5 36 2
07.01.2006 6 34 456
08.01.2006 0 35 789
09.01.2006 1 37 9
10.01.2006 2 35 32
11.01.2006 3 34 546
12.01.2006 4 34 766

надо сделать так, чтобы выдавало кол-во отгружаемого товара понедельно:
код 1 неделя 2неделя
34 891 1312
35 424 821
36 336 0
37 768 9

кручу верчу, получаю не то что надо
16 июн 06, 12:37    [2778966]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
Геннадич
Member

Откуда: Алматы
Сообщений: 640
group by спасёт
16 июн 06, 12:39    [2778985]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Тынц №1 - Транспонирование строк в столбцы (если число столбцов фиксировано и заранее известно)
Тынц №2 - Транспонирование строк в столбцы в рефкурсоре (если число столбцов переменно и заране неизвестно)

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
16 июн 06, 12:41    [2778997]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
Elic
Member

Откуда:
Сообщений: 29990
День недели - избыточное понятие
select to_char("дата", 'yyyy') as year, to_char("дата", 'ww') as weak_of_year, "код", sum("кол") as "кол" from "таблица"
  group by to_char("дата", 'yyyy'), to_char("дата", 'ww'), "код"
+ вышеозначенное транспонирование
16 июн 06, 12:49    [2779051]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
softy
Member

Откуда: from Russia
Сообщений: 5911
Elic
День недели - избыточное понятие


Причём абсолютно неприменимое для решения задачи. Столбец "День недели" - это именно день недели. А человеку нужно сгруппировать по неделе года.
В любом случае по дате можно получить день недели и неделю года. Разработчиков - на мыло!?!?
16 июн 06, 12:54    [2779101]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116251
softbuilder@inbox.ru
Elic
День недели - избыточное понятие


Причём абсолютно неприменимое для решения задачи. Столбец "День недели" - это именно день недели. А человеку нужно сгруппировать по неделе года.
В любом случае по дате можно получить день недели и неделю года. Разработчиков - на мыло!?!?

ИМХО.
Все это совершенно верно в том случае, когда производственная неделя совпадает с оракловской :), что в данном случае и произошло. Столбец "день недели" очень неуклюже, но намекает на то, что в принципе неделя может быть "плавающей".
16 июн 06, 12:59    [2779140]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
Elic
Member

Откуда:
Сообщений: 29990
dmidek
ИМХО.
Все это совершенно верно в том случае, когда производственная неделя совпадает с оракловской :), что в данном случае и произошло. Столбец "день недели" очень неуклюже, но намекает на то, что в принципе неделя может быть "плавающей".
Это не освобождает разработчика от ответственности за невведение реквизита "номер недели", восполняющего неинформативность "дня недели" :)
Более того, я не представляю, насколько глубоко должна "заплыть неделя", чтобы не хватило масок WW, W, IW, DY.
16 июн 06, 13:18    [2779283]     Ответить | Цитировать Сообщить модератору
 Re: преобразовать таблу  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Владимор Конев
Тынц №1 - Транспонирование строк в столбцы (если число столбцов фиксировано и заранее известно)
Тынц №2 - Транспонирование строк в столбцы в рефкурсоре (если число столбцов переменно и заране неизвестно)

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер

Вот второй Тынц немного по другой логике работает. Правильней его назвать "Если смысл столбцов определяется не значением, а порядковым номером значения".
Что в данной задаче не так: если 3-й день пропущен, то данные про 4-й все равно должны быть в 4-ом столбце а не в 3-ем.
Как вариант его (Тынц №2) модифицировать к ровно смыслу Тынца №1:
create or replace package pkg_crosstab2 as
/* SL. refactored from  https://www.sql.ru/faq/faq_topic.aspx?fid=281*/
type array is table of varchar2 (30);

  function pivot (
    p_query in varchar2
  , p_anchor in vc_array
  , p_pivot in varchar2
  , p_value_field in varchar2
  , p_value_function in VARCHAR2)
  return sys_refcursor
  ;
end;
/

create or replace package body pkg_crosstab2 as

  function pivot (
    p_query in varchar2
  , p_anchor in vc_array
  , p_pivot in varchar2
  , p_value_field in varchar2
  , p_value_function in VARCHAR2)
  return sys_refcursor
  as
    l_max_cols number;
    l_cursor sys_refcursor;
    l_query long;
    -- l_col_query varchar2(4000);
    l_pivot_value varchar2(200);
  begin
    -- construct the query
    -- start with the anchor columns:
    l_query := 'select ';
    for i in 1 .. p_anchor.count loop
      l_query := l_query || p_anchor (i) || ',';
    end loop;
    -- cursor for pivot column values
    open l_cursor for  'select distinct to_char('||p_pivot||') from ('||p_query || ')';
    -- now add in the c{x+1}... cn column for the values to be pivoted:
    -- the format is "p_value_function(decode(to_char(p_pivot),l_pivot_value,p_value_field,null)) l_pivot_value"
    loop
      fetch l_cursor into l_pivot_value;
      exit when l_cursor%notfound;
      l_query := l_query ||p_value_function ||'(decode(to_char(' || p_pivot ||'),'''||l_pivot_value ||''','||p_value_field ||',null)) "'
              ||l_pivot_value || '",';
    end loop;
    close l_cursor;
    -- now just add in the original query
    l_query := rtrim (l_query, ',') || ' from ( ' || p_query || ') group by ';

    -- and then the group by columns...
    for i in 1 .. p_anchor.count loop
      l_query := l_query || p_anchor (i) || ',';
    end loop;

    l_query := rtrim (l_query, ',');
    -- and return it
    
    execute immediate 'alter session set cursor_sharing=force';
    open l_cursor for l_query;
    execute immediate 'alter session set cursor_sharing=exact';
    RETURN l_cursor;
  end;
end;
/
16 июн 06, 18:03    [2781538]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить