Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2009, 14:49   #11
span4
Пользователь
 
Регистрация: 04.04.2009
Сообщений: 33
По умолчанию

SQL Server Menegement Studio
span4 вне форума Ответить с цитированием
Старый 19.05.2009, 15:34   #12
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

под МС СКЛ не писал и не охота разбираться в синтаксисе
тогда накидаю некий обощенный код, очень похожий на мс скл, по сути дела будут каменты с пояснениями

это процедурка создания и заполнения таблы с динамическим набором колонок (написана на синтаксисе близком к интербейзовскому - возможно, что разделители могут быть другие и т.п.)
предполагается что айдишники имеют тип integer, кол-во чего не указано (может остаток в кг...)- значит возьмем вещественный тип, автор сам при случае его выправит в нужный

Код:
create procedure get_remain_info
as
declare variable l_id_mag integer;
declare variable l_id_tovar integer;
declare variable l_fields_def varchar(250);
declare variable l_insert_statement varchar(4096);
declare variable l_ostatok number;

begin
  /* удаляем таблицу - набор колонок след.запроса может не совпасть с предыдущим набором */
  drop table remains;

  l_fields_def := 'create table remains (id_tovar integer';
  /* получаем список всех магазинов в виде курсора и набираем строчку полей для создания всех необходимых колонок*/
  for select id_mag
      from your_table
      group by id_mag
      into :l_id_mag
  do begin
      l_fields_def := l_fields_def || ', f' || :l_id_mag || ' number';
  end
  l_fields_def := l_fields_def || ');';
  /* далее выполняем собранную строчку, т.е. создаем временную таблицу remains - именно этот кусок кода делаю как в оракле, наверняка в мс скл есть свой аналог */
  execute immediate l_fields_def;
  
  /* далее выцепляем список товаров в курсор */
  for select id_tovar
      from your_table
      group by id_tovar
      into :l_id_tovar
   do begin
      /*  листаем курсор по товару, внутри него открываем курсор по магазинам и для каждой пары товар-магаз находим кол-во остатков */        
        l_insert_statement := 'insert into remains values(' || :l_id_tovar;

        for select id_mag
             from your_table
             group by id_mag
             into :l_id_mag
        do begin  
           /* здесь оракловая функа NVL для подстраховки */
           select nvl(sum(ostatok), 0)
           from your_table
           where 0=0
              and id_tovar = :l_id_tovar
              and id_mag = :l_id_mag
           into :l_ostatok;
           
           l_insert_statement := l_insert_statement || ', ' || :l_ostatok;
        end
        l_insert_statement := l_insert_statement || ')';

        /* заполняем временную таблицу остатками построчно  */
        execute immediate l_insert_statement;
   end
end;
/
в принципе, есть пара мест где можно экспешоны обработать при желании

Последний раз редактировалось soleil@mmc; 19.05.2009 в 16:04.
soleil@mmc вне форума Ответить с цитированием
Старый 20.05.2009, 10:38   #13
span4
Пользователь
 
Регистрация: 04.04.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
еще раз объясняю
реши для себя вопрос - "что я буду делать с этими данными дальше?"
отсюда будет и способ решения:
1) "в отчет" один вариант - там колонки будут созданы динамически по первому запросу (самим отчетом), строчки прирастут
2) "в БД" - другой вариант - здесь нужно либо предварительно создавать таблу с заведомо превышающем кол-вом строк под все магазины, либо динамически в процедуре (ДМЛ в процедурах не есть хорошо) под полученное кол-во из первого запроса (а отсюда уже можно будет и в отчет сливать инфу простым селектом)
а для отчета как будет выглядеть?
span4 вне форума Ответить с цитированием
Старый 30.05.2009, 02:13   #14
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Если я тебя правильно понял то тебе нужно плучить перекрестную динамическую таблицу. Если у тебя СУБД MS SQL Server то в данной книге во второй главе данное решение описано:http://www.knigka.info/2007/08/31/ra...5_primery.html
Evgeniy26 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамический запрос access 2007 Тупой Microsoft Office Access 3 26.06.2009 17:52
Динамический запрос kaizer131 Microsoft Office Access 6 03.04.2009 22:23
Динамический массив Ivin Мультимедиа в Delphi 14 27.02.2009 23:22
запрос ссылается на несвязанный с ним запрос kolebatel SQL, базы данных 0 11.06.2008 12:50
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2007 23:54