|   |   | 
| 
 | Хитрые задачи на запросы? | ☑ | ||
|---|---|---|---|---|
| 0
    
        Нуф-Нуф 23.05.12✎ 13:05 | 
        Для повышения собственной самооценки и разминки мозга, предлагайте
  хитрые задачи на составление запросов, ОПТИМАЛЬНЫХ запросов. Будем пробовать решить. | |||
| 1
    
        Жан Пердежон 23.05.12✎ 13:06 | 
        www.sql-ex.ru     | |||
| 2
    
        DrShad 23.05.12✎ 13:07 | 
        ну напиши разделение n количества номенклатуры на m количество складов, например     | |||
| 3
    
        shuhard 23.05.12✎ 13:08 | ||||
| 4
    
        Нуф-Нуф 23.05.12✎ 13:11 | 
        (1) интересно
  (2) эээ, не догнал... (3) гляну | |||
| 5
    
        ptiz 23.05.12✎ 13:12 | 
        Как получить произведение по колонке таблицы?
  А то СУММА() есть, а ПРОИЗВЕДЕНИЕ() нету. | |||
| 6
    
        1C-band 23.05.12✎ 13:13 | 
        Таблица с полями:
  - ID задачи - Наименование задачи - ID предыдущей задачи Проверить данные (граф?) на зацикленность SQL-запросом. | |||
| 7
    
        shuhard 23.05.12✎ 13:19 | 
        (4) [гляну]
  погляди, написанные Глорией 10 лет назад запросы изумительны | |||
| 8
    
        experimentator76 23.05.12✎ 13:29 | 
        (7) дык он вероятно просит на ущербных восьмерошных запросах )
  (5) присоединяюсь) | |||
| 9
    
        GROOVY 23.05.12✎ 13:34 | 
        Пускай есть регистр накопления остатков "ПартииТоваров": Товар, Партия, Количество, Стоимость.
  Есть документ "Продажа" в табличной части которого: Товар, Партия, Количество. Нужно построить запрос который получит данные для партионного списания, причем указанная партия в ТЧ документа списывается всегда первой, а если ее не хватает или она не указала происходит простое партионное списание по методу FIFO. В ТЧ документа можно указывать один и тот же товар несколько раз с разными партиями или без них. Задачу нужно решить исключительно запросом. То есть результат запроса должен по сути содержать таблицу движения регистра. | |||
| 10
    
        serffer 23.05.12✎ 13:43 | 
        1. Срез последних вручную
  2. Остатки и обороты вручную 3. проставить номер строки у списка документов 4. вывести пары контрагентов поставляющие одинаковое число номенклатуры 5. вывести пары контрагентов поставляющие одинаковый перечень номенклатуры 6. грузы максимально равномерно распределить по машинам(задача про ранец) | |||
| 11
    
        Kashemir 23.05.12✎ 15:10 | 
        (9) Пусть тебя совесть мучает - оставил меня без обеда :)
  ВЫБРАТЬ ПродажаТЧ.Товар КАК Товар, ПродажаТЧ.Партия КАК Партия, СУММА(ПродажаТЧ.Количество) КАК Количество ПОМЕСТИТЬ ТЧ ИЗ Документ.Продажа.ТЧ КАК ПродажаТЧ ГДЕ ПродажаТЧ.Ссылка = &ДокументПродажи СГРУППИРОВАТЬ ПО ПродажаТЧ.Товар, ПродажаТЧ.Партия ИНДЕКСИРОВАТЬ ПО Товар, Партия ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПартииТоваровОстатки.Товар КАК Товар, ПартииТоваровОстатки.Партия КАК Партия, ПартииТоваровОстатки.КоличествоОстаток, ПартииТоваровОстатки.СтоимостьОстаток ПОМЕСТИТЬ ОстаткиНаСкладах ИЗ РегистрНакопления.ПартииТоваров.Остатки( &ПозицияДокумента, Товар В (ВЫБРАТЬ ТЧ.Товар ИЗ ТЧ КАК ТЧ)) КАК ПартииТоваровОстатки ИНДЕКСИРОВАТЬ ПО Товар, Партия ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТЧ.Товар, ТЧ.Партия, ТЧ.Количество, ВЫБОР КОГДА ТЧ.Количество <= ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0) ТОГДА ТЧ.Количество ИНАЧЕ ОстаткиНаСкладах.КоличествоОстаток КОНЕЦ КАК СписаноКоличество, ВЫБОР КОГДА ТЧ.Количество <= ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0) ТОГДА ВЫБОР КОГДА ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0) = 0 ТОГДА 0 ИНАЧЕ ВЫРАЗИТЬ(ТЧ.Количество * (ОстаткиНаСкладах.СтоимостьОстаток / ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0)) КАК ЧИСЛО(19, 0)) КОНЕЦ ИНАЧЕ ОстаткиНаСкладах.СтоимостьОстаток КОНЕЦ КАК СписанаСтоимость ПОМЕСТИТЬ РаспределеноПоУказаннымПартиям ИЗ ТЧ КАК ТЧ ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиНаСкладах КАК ОстаткиНаСкладах ПО (ОстаткиНаСкладах.Товар = ТЧ.Товар) И (ОстаткиНаСкладах.Партия = ТЧ.Партия) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ОстаткиНаСкладах.Товар, ОстаткиНаСкладах.Партия, СУММА(ОстаткиНаСкладах.КоличествоОстаток - РаспределеноПоУказаннымПартиям.СписаноКоличество) КАК КоличествоОстаток, СУММА(ОстаткиНаСкладах.СтоимостьОстаток - РаспределеноПоУказаннымПартиям.СписанаСтоимость) КАК СтоимостьОстаток ПОМЕСТИТЬ ОстаткиЗаВычетомПриоритетыхПартий ИЗ ОстаткиНаСкладах КАК ОстаткиНаСкладах ЛЕВОЕ СОЕДИНЕНИЕ РаспределеноПоУказаннымПартиям КАК РаспределеноПоУказаннымПартиям ПО ОстаткиНаСкладах.Товар = РаспределеноПоУказаннымПартиям.Товар И ОстаткиНаСкладах.Партия = РаспределеноПоУказаннымПартиям.Партия СГРУППИРОВАТЬ ПО ОстаткиНаСкладах.Товар, ОстаткиНаСкладах.Партия ИМЕЮЩИЕ СУММА(ОстаткиНаСкладах.КоличествоОстаток - РаспределеноПоУказаннымПартиям.СписаноКоличество) > 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РаспределеноПоУказаннымПартиям.Товар КАК Товар, СУММА(РаспределеноПоУказаннымПартиям.Количество - РаспределеноПоУказаннымПартиям.СписаноКоличество) КАК Количество ПОМЕСТИТЬ ПодлежитДораспределению ИЗ РаспределеноПоУказаннымПартиям КАК РаспределеноПоУказаннымПартиям СГРУППИРОВАТЬ ПО РаспределеноПоУказаннымПартиям.Товар ИМЕЮЩИЕ СУММА(РаспределеноПоУказаннымПартиям.Количество - РаспределеноПоУказаннымПартиям.СписаноКоличество) > 0 ИНДЕКСИРОВАТЬ ПО Товар ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.Товар, ВложенныйЗапрос.Партия, ВложенныйЗапрос.КоличествоНакопительныйОстаток, ОстаткиЗаВычетомПриоритетыхПартий.КоличествоОстаток, ОстаткиЗаВычетомПриоритетыхПартий.СтоимостьОстаток ПОМЕСТИТЬ НумерованныеПартииСНакопительнымОстатком ИЗ (ВЫБРАТЬ ОстаткиЗаВычетомПриоритетыхПартий.Товар КАК Товар, ОстаткиЗаВычетомПриоритетыхПартий.Партия КАК Партия, СУММА(ОстаткиЗаВычетомПриоритетыхПартий1.КоличествоОстаток) КАК КоличествоНакопительныйОстаток ИЗ ОстаткиЗаВычетомПриоритетыхПартий КАК ОстаткиЗаВычетомПриоритетыхПартий ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиЗаВычетомПриоритетыхПартий КАК ОстаткиЗаВычетомПриоритетыхПартий1 ПО ОстаткиЗаВычетомПриоритетыхПартий.Товар = ОстаткиЗаВычетомПриоритетыхПартий1.Товар И ОстаткиЗаВычетомПриоритетыхПартий.Партия >= ОстаткиЗаВычетомПриоритетыхПартий1.Партия СГРУППИРОВАТЬ ПО ОстаткиЗаВычетомПриоритетыхПартий.Товар, ОстаткиЗаВычетомПриоритетыхПартий.Партия) КАК ВложенныйЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиЗаВычетомПриоритетыхПартий КАК ОстаткиЗаВычетомПриоритетыхПартий ПО ВложенныйЗапрос.Товар = ОстаткиЗаВычетомПриоритетыхПартий.Товар И ВложенныйЗапрос.Партия = ОстаткиЗаВычетомПриоритетыхПартий.Партия ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПодлежитДораспределению.Товар, НумерованныеПартииСНакопительнымОстатком.Партия, ВЫБОР КОГДА ПодлежитДораспределению.Количество >= ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0) ТОГДА ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) ИНАЧЕ ПодлежитДораспределению.Количество + ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) - ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0) КОНЕЦ КАК КоличествоСписания, ВЫБОР КОГДА ПодлежитДораспределению.Количество >= ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0) ТОГДА ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.СтоимостьОстаток, 0) КОГДА ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) = 0 ТОГДА 0 ИНАЧЕ (ПодлежитДораспределению.Количество + ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) - ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0)) * (ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.СтоимостьОстаток, 0) / ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0)) КОНЕЦ КАК СтоимостьСписания ИЗ ПодлежитДораспределению КАК ПодлежитДораспределению ЛЕВОЕ СОЕДИНЕНИЕ НумерованныеПартииСНакопительнымОстатком КАК НумерованныеПартииСНакопительнымОстатком ПО ПодлежитДораспределению.Товар = НумерованныеПартииСНакопительнымОстатком.Товар И (ПодлежитДораспределению.Количество >= ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0) ИЛИ ПодлежитДораспределению.Количество > ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0) - ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0)) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ РаспределеноПоУказаннымПартиям.Товар, РаспределеноПоУказаннымПартиям.Партия, РаспределеноПоУказаннымПартиям.СписаноКоличество, РаспределеноПоУказаннымПартиям.СписанаСтоимость ИЗ РаспределеноПоУказаннымПартиям КАК РаспределеноПоУказаннымПартиям | |||
| 12
    
        Kashemir 23.05.12✎ 15:16 | 
        + (10) FIFО забыл 
  вместо И ОстаткиЗаВычетомПриоритетыхПартий.Партия >= ОстаткиЗаВычетомПриоритетыхПартий1.Партиянужно И (ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата > ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата
  | |||
| 13
    
        GROOVY 23.05.12✎ 15:17 | 
        (12) Ага и партии в ТЧ документа тоже по хорошему сортировать надо.
  Вечером гляну по поводу оптимальности, но код мне нравится :) | |||
| 14
    
        Ненавижу 1С гуру 23.05.12✎ 15:18 | 
        коэффициенты СЛАУ и свободные члены заданы таблицами, требуется запросом получить значения решения СЛАУ     | |||
| 15
    
        Kashemir 23.05.12✎ 15:46 | 
        +(12) таки LIFO получилось ... дубль правка
  И (ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата < ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата ИЛИ ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата = ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата И ОстаткиЗаВычетомПриоритетыхПартий.Партия <= ОстаткиЗаВычетомПриоритетыхПартий1.Партия) +(13) По идее по оптимальности должно быть норм - не думаю что возникнут какие-то сложности. Сортировать партии в тч - это уже тюнинг :) | |||
| 16
    
        zak555 23.05.12✎ 16:01 | 
        ВЫБОР
  КОГДА ТЧ.Количество <= ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0) ТОГДА ТЧ.Количество ИНАЧЕ ОстаткиНаСкладах.КоличествоОстаток КОНЕЦ КАК СписаноКоличество у меня в ТЧ количество 10 штук, а на складе его нет тогда в СписаноКоличество будет NULL | |||
| 17
    
        Лефмихалыч 23.05.12✎ 16:04 | 
        (0) держи:
  1. Остатки на каждую дату в запросе 2. Нумерация строк в запросе 3. Получить вторые n записей 4. Из справочника с иерархией элементов получить только те элементы, у которых: 4.1 нет подчиненных 4.2 есть подчиненные | |||
| 18
    
        rs_trade 23.05.12✎ 16:06 | 
        (0) куцым языком запросов 1С оптимально не попишешь     | |||
| 19
    
        IKSparrow 23.05.12✎ 16:09 | 
        Хех, поросёнок слился... :))     | |||
| 20
    
        IKSparrow 23.05.12✎ 16:10 | 
        (18) Полностью согласен. Хотя всё же есть гении/извращенцы умеющие его применять.     | |||
| 21
    
        Axel2009 23.05.12✎ 16:10 | 
        (0) рассчитать оборачиваемость товара по средним остаткам за месяц, с учетом прогноза продаж на этот месяц, учитывая что прогноз считается по последнйе дате наличия документа продажи.
  т.е. к1 100руб, отчитался 15 числа - прогноз 200 руб. к2 150руб, отчитался 5 числа - прогноз 900 руб. | |||
| 22
    
        Kashemir 23.05.12✎ 16:41 | 
        (16) Если желаешь контроль остатков - сделал дополнительную колонку и сравни итог по списаному/списываему. Такой задачи в исходной постановке нет.     | |||
| 23
    
        Kashemir 23.05.12✎ 16:43 | 
        +(22) Либо любым другим способом. Эта проблема решается без особых затруднений.     | |||
| 24
    
        fisher 23.05.12✎ 17:21 | 
        (1) +1
  Тема закрыта :) | |||
| 25
    
        zak555 23.05.12✎ 17:53 | 
        (22) ты ж используешь левое соединение, а не внутренние => надо учесть     | |||
| 26
    
        Kashemir 23.05.12✎ 17:57 | 
        (25) Согласен - причем это не единственная мелочь которую стоило бы поправить - лень возиться :)     | |||
| 27
    
        andrewks 23.05.12✎ 18:00 | 
        (0) преобразование текстовой записи рационального числа в соответствующее число в статическом запросе     | |||
| 28
    
        crazy_killer 23.05.12✎ 19:54 | 
        *закладка*     | |||
| 29
    
        zak555 24.05.12✎ 09:29 | 
        GROOVY так и не посмотрел ?     | |||
| 30
    
        sparklemal 24.05.12✎ 09:48 | 
        привет, есть такая задача: на обработке есть ТабЧасть с двумя колонками (номенклатура, характеристика). Нужно выбрать все документы "ПоступлениеТоваровУслуг" в которых встречается ТОЛЬКО сочетание ВСЕХ записей (номенклатуры,характеристики) из ТабЧасти обработки. Например в ТабЧасти задали Номенкл1, Номенкл2. Если в документе будет Номенкл1,Номенкл2,Номенкл3, то уже данный документ не должен попасть в выборку.
  Я так понимаю что можно решить задачу так: загнать ТабЧасть в временную таблицу и искать документы в которых встречается номенклатура из временной таблицы с условием по количеству записей в ТЧ документа и количечству записей во временной таблице. НО, может быть как нить еще можно решить данную задачу? | |||
| 31
    
        rphosts 24.05.12✎ 10:00 | 
        Хорошая тема! 
  Ещё задачки будут? | |||
| 32
    
        ptrtss 24.05.12✎ 10:05 | 
        Вот вам, коллеги, на работе делать-то нехрен     | |||
| 33
    
        rphosts 24.05.12✎ 10:18 | 
        (32) кто сказал, что на раб? 
  В субб. иду на ДР, в воскр. буду под консоль запросов приходить в чувство.... задача из (9) интересная (делал подобное по аналогам, но там было достаточно при обходе анализировать остаток несписанного) да и другие тоже неплохие есть. | |||
| 34
    
        Axel2009 24.05.12✎ 11:57 | 
        (30) не сложная задача
  выбрать поступление из документ.поступления внутреннее соединение наборпар по поступление.номенклатура = наборпар.номенклатура И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры сгруппировать по поступление имеющие количество(*) = (ВЫБРАТЬ количество(*) из наборпар) | |||
| 35
    
        sparklemal 24.05.12✎ 12:00 | 
        (34) так с условием по количеству строк я решил, а вот без него как сделать можно?     | |||
| 36
    
        Axel2009 24.05.12✎ 12:24 | 
        (35) (30) не сложная задача 
  выбрать поступление из документ.поступления ПОЛНОЕ соединение наборпар по поступление.номенклатура = наборпар.номенклатура И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры сгруппировать по поступление имеющие максимум(выбор когда поступление.номенклатура есть null или наборпар.номенклатура есть null тогда максимум иначе ложь конец) = ложь | |||
| 37
    
        Axel2009 24.05.12✎ 12:24 | 
        (36)+
  попутал.. выбрать поступление из документ.поступления ПОЛНОЕ соединение наборпар по поступление.номенклатура = наборпар.номенклатура И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры сгруппировать по поступление имеющие максимум(выбор когда поступление.номенклатура есть null или наборпар.номенклатура есть null тогда ИСТИНА иначе ложь конец) = ложь | |||
| 38
    
        FoxFox 24.05.12✎ 12:26 | 
        (0) в задачнике на спеца платформы полно таких     | |||
| 39
    
        Axel2009 24.05.12✎ 12:26 | 
        неправильно написал. нужен кроссджоин еще
  выбрать поступление из документ.поступления.товары ПОЛНОЕ соединение (выбрать номенклатура, характеристиканоменклатуры, поступление из наборпар, (выбрать поступление из документ.поступления) как таблицапоступлений) по поступление.номенклатура = наборпар.номенклатура И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры И поступление.поступление = наборпар.поступление сгруппировать по поступление имеющие максимум(выбор когда поступление.номенклатура есть null или наборпар.номенклатура есть null тогда ИСТИНА иначе ложь конец) = ложь | |||
| 40
    
        АНДР 24.05.12✎ 13:04 | 
        (0) Не забудьте в перерыве в типовые глянуть... Например на структуру индексов АдресногоКлассификатора.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |