Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Сортировка результатов запроса в самом запросе (число прочтений - 10841 )
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Сортировка результатов запроса в самом запросе
30. Января 2009 :: 00:04
Печать  
Не получается сделать сортировку результатов или условие вот такого запроса (из отладки)

SELECT
     Рег.Фирма AS [Фирма_1c_type_Справочник_Фирмы], 
     Рег.Товар AS [Товар_1c_type_Справочник_Номенклатура],
     ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1) AS ФлагРазныхЦен,
     SUM(Рег.ОстатокТовара) AS Остаток
FROM
     (SELECT   
           Рег_1.sp3204 AS Фирма,
           Рег_1.sp3206 AS Склад,
           Рег_1.sp3205 AS Товар,
           Рег_1.sp3210 AS ЦенаПродажи,
           Рег_1.sp3207 AS ОстатокТовара
     FROM
           rg3203 AS Рег_1
     WHERE
           (PERIOD = {d '2008-12-01'})
           AND (Рег_1.sp3206='     0   ')
           AND (Рег_1.sp3204='     2   ')

     UNION ALL

     SELECT   
           Рег_2.sp3204 AS Фирма,
           Рег_2.sp3206 AS Склад,
           Рег_2.sp3205 AS Товар,
           Рег_2.sp3210 AS ЦенаПродажи,
           Рег_2.sp3207*(1-Рег_2.debkred*2) AS ОстатокТовара
     FROM
           ra3203 AS Рег_2
     INNER JOIN
           1sjourn jr ON Рег_2.iddoc = jr.iddoc
                 AND (jr.date BETWEEN {d '2009-01-01'} AND {d '2009-01-20'})
                 AND (rf3203 = 1)
     WHERE
           (Рег_2.sp3204='     2   ')
     ) Рег 

GROUP BY
   Рег.Товар,
   Рег.Фирма

HAVING
     SUM(Рег.ОстатокТовара)>0

ORDER BY
     Рег.ФлагРазныхЦен,
     Рег.Товар

вот что пишет

FAILED! ICommandText::Execute(): SQL: Column 'ФЛАГРАЗНЫХЦЕН' is not found.

не работает и условие в секции HAVING

типа

HAVING
     SUM(Рег.ОстатокТовара)>0 AND Рег.ФлагРазныхЦен=1

ошибка та же самая.



  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #1 - 30. Января 2009 :: 00:40
Печать  
в догонку вопрос. чтобы обойти ошибку в сабже я сделал так

1 запрос определяет список товаров у которых флаг этот больше 1 (сортировка ТЗ результатов и перегрузка нужного диапазона в список значений)
2 запрос по фильтру-списку товаров получает все необходимые данные.

так вот метод УложитьСписокЗлементов работает непозволительно долго

на 1300 элементах 12.5 секунд почему? может я чего не так делаю?
  
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #2 - 30. Января 2009 :: 03:20
Печать  
у тебя по этому полю группировки нет, поэтому и ругается

  
Наверх
ICQ  
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #3 - 30. Января 2009 :: 04:51
Печать  
vivm писал(а) 30. Января 2009 :: 03:20:
у тебя по этому полю группировки нет, поэтому и ругается



хм. а  считал что если я использую вычисляемое поле то группировка не нужна. попробую

а по второму вопросу?
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #4 - 30. Января 2009 :: 04:59
Печать  
хотя странно. без группировки эта колонка попадает в табличцу результатов.
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #5 - 30. Января 2009 :: 05:05
Печать  
SELECT
     Рег.Фирма AS [Фирма_1c_type_Справочник_Фирмы], 
     Рег.Товар AS [Товар_1c_type_Справочник_Номенклатура],
     ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1) AS ФлагРазныхЦен,
     SUM(Рег.ОстатокТовара) AS Остаток
FROM
     (SELECT   
           Рег_1.sp3204 AS Фирма,
           Рег_1.sp3206 AS Склад,
           Рег_1.sp3205 AS Товар,
           Рег_1.sp3210 AS ЦенаПродажи,
           Рег_1.sp3207 AS ОстатокТовара
     FROM
           rg3203 AS Рег_1
     WHERE
           (PERIOD = {d '2008-12-01'})
           AND (Рег_1.sp3206='     0   ')
           AND (Рег_1.sp3204='     2   ')

     UNION ALL

     SELECT   
           Рег_2.sp3204 AS Фирма,
           Рег_2.sp3206 AS Склад,
           Рег_2.sp3205 AS Товар,
           Рег_2.sp3210 AS ЦенаПродажи,
           Рег_2.sp3207*(1-Рег_2.debkred*2) AS ОстатокТовара
     FROM
           ra3203 AS Рег_2
     INNER JOIN
           1sjourn jr ON Рег_2.iddoc = jr.iddoc
                 AND (jr.date BETWEEN {d '2009-01-01'} AND {d '2009-01-20'})
                 AND (rf3203 = 1)
     WHERE
           (Рег_2.sp3204='     2   ')
     ) Рег 

GROUP BY
   Рег.Товар,
   Рег.Фирма,
   Рег.ФлагРазныхЦен

HAVING
     SUM(Рег.ОстатокТовара)>0 AND Рег.ФлагРазныхЦен=1

ORDER BY
     Рег.Товар
FAILED! ICommandText::Execute(): SQL: Column 'ФЛАГРАЗНЫХЦЕН' is not found.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #6 - 30. Января 2009 :: 05:49
Печать  
Все правильно, драйвер выдает ошибку т.к. в таблице под псевдонимом Рег нет поля ФлагРазныхЦен. Надо так писать:

SELECT
    Рег.Фирма AS [Фирма_1c_type_Справочник_Фирмы],  
    Рег.Товар AS [Товар_1c_type_Справочник_Номенклатура],
    ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1) AS ФлагРазныхЦен,
    SUM(Рег.ОстатокТовара) AS Остаток
FROM
    (SELECT  
          Рег_1.sp3204 AS Фирма,
          Рег_1.sp3206 AS Склад,
          Рег_1.sp3205 AS Товар,
          Рег_1.sp3210 AS ЦенаПродажи,
          Рег_1.sp3207 AS ОстатокТовара
    FROM
          rg3203 AS Рег_1
    WHERE
          (PERIOD = {d '2008-12-01'})
          AND (Рег_1.sp3206='     0   ')
          AND (Рег_1.sp3204='     2   ')

    UNION ALL

    SELECT  
          Рег_2.sp3204 AS Фирма,
          Рег_2.sp3206 AS Склад,
          Рег_2.sp3205 AS Товар,
          Рег_2.sp3210 AS ЦенаПродажи,
          Рег_2.sp3207*(1-Рег_2.debkred*2) AS ОстатокТовара
    FROM
          ra3203 AS Рег_2
    INNER JOIN
          1sjourn jr ON Рег_2.iddoc = jr.iddoc
                AND (jr.date BETWEEN {d '2009-01-01'} AND {d '2009-01-20'})
                AND (rf3203 = 1)
    WHERE
          (Рег_2.sp3204='     2   ')
    ) Рег  

GROUP BY
 Рег.Товар,
 Рег.Фирма

HAVING
    SUM(Рег.ОстатокТовара)>0

ORDER BY
    Рег.Товар, ФлагРазныхЦен

В предложениях запроса GROUP BY и HAVING нельзя использовать псевдонимы полей заданные в текущем запросе, их можно использовать только в предложении ORDER BY без указания имени таблицы.

Если это требуется, то надо писать повторяя выражение вычисления поля, вот так:

GROUP BY
 Рег.Товар,
 Рег.Фирма,
 ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1)

HAVING
    SUM(Рег.ОстатокТовара)>0
    AND ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1) = 1

Это вобщем-то в первом классе проходят.. Улыбка
  
Наверх
ICQ  
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #7 - 01. Февраля 2009 :: 13:25
Печать  
я не знаю в каком классе это проходят но то что ты написал типа
     |HAVING
                 |      SUM(Рег.ОстатокТовара)>0 AND ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1)=1

вызывает ошибку

FAILED! ICommandText::Execute(): SQL: DISTINCT is invalid.
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #8 - 01. Февраля 2009 :: 13:26
Печать  
вопрос по "Уложитьсписокэлементов" в силе -  работает крайне медленно. 14 секунд 1300 элементов в списке... чего делать то?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #9 - 01. Февраля 2009 :: 13:54
Печать  
Стрелок писал(а) 01. Февраля 2009 :: 13:26:
вопрос по "Уложитьсписокэлементов" в силе -  работает крайне медленно. 14 секунд 1300 элементов в списке... чего делать то?

А может стоит фильтровать по родителю?
  
Наверх
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #10 - 01. Февраля 2009 :: 14:00
Печать  
leshik писал(а) 01. Февраля 2009 :: 13:54:
Стрелок писал(а) 01. Февраля 2009 :: 13:26:
вопрос по "Уложитьсписокэлементов" в силе -  работает крайне медленно. 14 секунд 1300 элементов в списке... чего делать то?

А может стоит фильтровать по родителю?


не могу представить себе логику такой сортировки? товары из всего справочника чёткого родителя нет в помине. всё вразброс
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #11 - 01. Февраля 2009 :: 14:33
Печать  
Я в запросе из 0 не увидел фильтра по таблице - не приведешь полный текст запроса где фильтр используется? И подскажи как формируется список товаров для укладки?
  
Наверх
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #12 - 01. Февраля 2009 :: 14:41
Печать  
Если ДатаОтбора>ПолучитьДатуТА() Тогда
                 ДатаОтбора=ПолучитьДатуТА();
                 ВидЗапроса=1;
           Иначе
                 ВидЗапроса=2;
           КонецЕсли;      
           
           ТекстЗапроса="
           |SELECT
           |      Рег.Фирма AS [Фирма $Справочник.Фирмы], 
           |      Рег.Товар AS [Товар $Справочник.Номенклатура],
           |      ICASE(COUNT(DISTINCT Рег.ЦенаПродажи)=1,0,1) AS ФлагРазныхЦен,
           |      SUM(Рег.ОстатокТовара) AS Остаток
           |FROM
           |      (SELECT   
           |            $Рег_1.Фирма AS Фирма,
           |            $Рег_1.Склад AS Склад,
           |            $Рег_1.Товар AS Товар,
           |            $Рег_1.ЦенаПродажи AS ЦенаПродажи,
           |            $Рег_1.ОстатокТовара AS ОстатокТовара
           |      FROM
           |            $РегистрИтоги.ОстаткиПоСкладамИПартиям AS Рег_1
           |      WHERE
           |            (PERIOD = :ПредМесяц~~)";
           Если ПустоеЗначение(СкладОтбора)=0 Тогда
                 ТекстЗапроса=ТекстЗапроса+"
                 |            AND ($Рег_1.Склад=:Склад)";
           КонецЕсли;
           ТекстЗапроса=ТекстЗапроса+"
           |            AND ($Рег_1.Фирма=:Фирма)
           |
           |      UNION ALL
           |
           |      SELECT   
           |            $Рег_2.Фирма AS Фирма,
           |            $Рег_2.Склад AS Склад,
           |            $Рег_2.Товар AS Товар,
           |            $Рег_2.ЦенаПродажи AS ЦенаПродажи,
           |            $Рег_2.ОстатокТовара*(1-Рег_2.debkred*2) AS ОстатокТовара
           |      FROM
           |            $Регистр.ОстаткиПоСкладамИПартиям AS Рег_2
           |      INNER JOIN
           |            1sjourn jr ON Рег_2.iddoc = jr.iddoc
           |                  AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~)
           |                  AND ($ФлагРегистра.ОстаткиПоСкладамИПартиям = 1)
           |      WHERE";
           Если ПустоеЗначение(СкладОтбора)=0 Тогда
                 ТекстЗапроса=ТекстЗапроса+"
                 |            ($Рег_2.Склад=:Склад) AND ";
           КонецЕсли;
           ТекстЗапроса=ТекстЗапроса+"
           |            ($Рег_2.Фирма=:Фирма)
           |      ) Рег 
           |
           |GROUP BY
           |   Рег.Товар,
           |   Рег.Фирма
           |
           |HAVING
           |      SUM(Рег.ОстатокТовара)>0
           |
           |ORDER BY
           |      Рег.Товар";
           
           БыстрыйЗапрос.Отладка(1);
           
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("Фирма",ФирмаОтбора);
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("Склад",СкладОтбора); 
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("ПредДата",ДатаОтбора);
           бора)-1));
           
           
           Попытка   
                 ТЗТоваров_Р=БыстрыйЗапрос.ВыполнитьИнструкцию(ТекстЗапроса); 
                 ТЗТоваров_Р.Сортировать("-ФлагРазныхЦен,+Товар");
                 ТЗТоваров_Р.ВыбратьСтроку();
           Исключение
                 Сообщить(ОписаниеОшибки());
                 Возврат;
           КонецПопытки;
           
           СтрТаб=0;
           ТЗТоваров_Р.НайтиЗначение(0,СтрТаб,"ФлагРазныхЦен");   
           Если СтрТаб=0 Тогда
                 Предупреждение("Отсутствует товар с разной продажной ценой");
                 Возврат;
           КонецЕсли;      
           Сообщить(Строка(ТЗТоваров_Р.КоличествоСтрок()));
           Сообщить(Строка(СтрТаб));
           // условия по товарам для второго запроса с полным разворотов по партиям
           СписокТоваров=СоздатьОбъект("СписокЗначений");
           ТЗТоваров_Р.Выгрузить(СписокТоваров,1,СтрТаб-1,"Товар");
           Сообщить(Строка(СписокТоваров.РазмерСписка()));
           ИмяТаблицы="#Список";
           БыстрыйЗапрос.УложитьСписокОбъектов(СписокТоваров,ИмяТаблицы,"Номенклатура"); 
           
           ТекстЗапроса="
           |SELECT
           |      Рег.Фирма AS [Фирма $Справочник.Фирмы], 
           |      Рег.Склад AS [Склад $Справочник.МестаХранения], 
           |      Рег.Товар AS [Товар $Справочник.Номенклатура],
           |   Рег.Партия AS [Партия $Документ],
           |      SUM(Рег.ОстатокТовара) AS Остаток
           |FROM
           |      (SELECT   
           |            $Рег_1.Фирма AS Фирма,
           |            $Рег_1.Склад AS Склад,
           |            $Рег_1.Товар AS Товар,
           |            $Рег_1.ПрихДокумент AS Партия, 
           |            $Рег_1.ОстатокТовара AS ОстатокТовара
           |      FROM
           |            $РегистрИтоги.ОстаткиПоСкладамИПартиям AS Рег_1
           |      WHERE
           |            (PERIOD = :ПредМесяц~~)";
           Если ПустоеЗначение(СкладОтбора)=0 Тогда
                 ТекстЗапроса=ТекстЗапроса+"
                 |            AND ($Рег_1.Склад=:Склад)";
           КонецЕсли;      
           ТекстЗапроса=ТекстЗапроса+"      
           |            AND ($Рег_1.Фирма=:Фирма)
           |          AND ($Рег_1.Товар IN (SELECT Val FROM "+ИмяТаблицы+"))
           |
           |      UNION ALL
           |
           |      SELECT   
           |            $Рег_2.Фирма AS Фирма,
           |            $Рег_2.Склад AS Склад,
           |            $Рег_2.Товар AS Товар,
           |            $Рег_2.ПрихДокумент AS Партия,   
           |            $Рег_2.ОстатокТовара*(1-Рег_2.debkred*2) AS ОстатокТовара
           |      FROM
           |            $Регистр.ОстаткиПоСкладамИПартиям AS Рег_2
           |      INNER JOIN
           |            1sjourn jr ON Рег_2.iddoc = jr.iddoc
           |                  AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~)
           |                  AND ($ФлагРегистра.ОстаткиПоСкладамИПартиям = 1)      
           |      WHERE";
           Если ПустоеЗначение(СкладОтбора)=0 Тогда
                 ТекстЗапроса=ТекстЗапроса+"
                 |            ($Рег_2.Склад=:Склад) AND ";
           КонецЕсли;
           ТекстЗапроса=ТекстЗапроса+"
           |            ($Рег_2.Фирма=:Фирма)
           |            AND ($Рег_2.Товар IN (SELECT Val FROM "+ИмяТаблицы+"))
           |      ) Рег
           |GROUP BY
           |   Рег.Товар,
           |   Рег.Фирма,
           |   Рег.Склад,
           |      Рег.Партия
           |
           |HAVING
           |      SUM(Рег.ОстатокТовара)>0
           |
           |ORDER BY
           |      Рег.Товар";   
           
           
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("Фирма",ФирмаОтбора);
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("Склад",СкладОтбора); 
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("ПредДата",ДатаОтбора);
           бора)-1));
                 
           
           Попытка   
                 ТЗТоваров=БыстрыйЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);
                 ТЗТоваров.ВыбратьСтроку();
           Исключение
                 Сообщить(ОписаниеОшибки());
                 Возврат;
           КонецПопытки;
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #13 - 01. Февраля 2009 :: 14:50
Печать  
Правильно ли я понимаю, что необходимо отобразить остатки только тех товаров, у которых более 1 продажной цены?
  
Наверх
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Сортировка результатов запроса в самом запросе
Ответ #14 - 01. Февраля 2009 :: 14:51
Печать  
да именно так

следует вывести остатки товаров в разрезе партий только тех, у которых две и более продажных цен в регистре
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать