|
Хитрые задачи на запросы? | ☑ | ||
---|---|---|---|---|
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) Не забудьте в перерыве в типовые глянуть... Например на структуру индексов АдресногоКлассификатора.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |