|
Помогите плз с запросом | ☑ | ||
---|---|---|---|---|
0
DasTPID
21.08.12
✎
18:27
|
Добрый день!
Имеется таблица(Дата, Номенклатура, Признак) Например: 01.08.2012 Номенклатура1 ложь 02.08.2012 Номенклатура1 истина 03.08.2012 Номенклатура1 ложь 04.08.2012 Номенклатура1 истина В результате выполнения запроса нужно получить таблицу с 32 колонками (Номенклатура, ПризнакНа1Число, ПризнакНа2Число, ... , ПризнакНа31Число) вида Номенклатура1 ложь истина ложь истина ... Номенклатура2 ..... .... |
|||
1
Defender aka LINN
21.08.12
✎
18:28
|
(0) Цена вопроса?
|
|||
2
Eugene_life
21.08.12
✎
18:29
|
(0) А пропуски по датам возможны?
|
|||
3
DasTPID
21.08.12
✎
18:30
|
Делал похожую задачу, только вместо булевого признака было количество:
вложенным запросом выбрал Номенклатура, ВЫБОР КОГДА ДЕНЬ(Дата) = 1 ТОГДА Количество ИНАЧЕ 0 КОНЕЦ КАК КоличествоНа1Число, ВЫБОР КОГДА ДЕНЬ(Дата) = 2 ТОГДА Количество ИНАЧЕ 0 КОНЕЦ КАК КоличествоНа2Число, .... а потом сгруппировать по Номенклатура но для булевых агрегатных функций нет и как это сделать я пока в ступоре |
|||
4
GROOVY
21.08.12
✎
18:30
|
ВЫБРАТЬ
Дата, Номенклатура, Признак ИЗ НазваниеТаблицы Все. |
|||
5
DasTPID
21.08.12
✎
18:31
|
(1) Осознание бескорыстной помощи людям - бесценно!
(2) Да, пропуски возможны |
|||
6
GROOVY
21.08.12
✎
18:32
|
(2) А какая разница? Если данные выводить в СКД то есть "дополнение", если выводить обходом запроса, то есть итоги по периодам, и пр.
|
|||
7
DasTPID
21.08.12
✎
18:32
|
(4) В выборке тогда будет три колонки - Дата, Номенклатура и Признак. А должно быть 32
|
|||
8
JesteR
21.08.12
✎
18:33
|
(4)С 32 колонками?
|
|||
9
mrd2006
21.08.12
✎
18:34
|
А почему 32 ?
|
|||
10
Жан Пердежон
21.08.12
✎
18:35
|
(4) При обходе результат запроса создай новую ТЗ
|
|||
11
DasTPID
21.08.12
✎
18:36
|
(9) Одна колонка - Номенклатура, и 31 - Признак на n-ный день месяца
|
|||
12
GROOVY
21.08.12
✎
18:36
|
(7) Количество полей в запросе не равно количеству колонок в результирующем формате вывода данных.
|
|||
13
GROOVY
21.08.12
✎
18:37
|
||||
14
GROOVY
21.08.12
✎
18:38
|
+13 создай в базе регистр сведений с названием регистрСведений1 и полями как в (0) и заполни его за январь текущего года. Посмотри отчет.
|
|||
15
DasTPID
21.08.12
✎
18:41
|
(13) Очень хотелось бы обойтись без СКД
|
|||
16
GROOVY
21.08.12
✎
18:44
|
(15) Обойдись без СКД.
Перебрать результат запроса можно в конструкции: Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл //Выводим строку ВыборкаКолонки = Выборка.Выбрать() ПОка ВыборкаКолонки.Слудующий() Цикл //Выводим колонки |
|||
17
DasTPID
21.08.12
✎
18:48
|
(16)
Это да, но мне не нужно перебирать результат запроса, мне нужно результат положить во временную таблицу, которая участвует в следующем запросе |
|||
18
GROOVY
21.08.12
✎
18:49
|
(17) И каким образом ты собираешься использовать таблицу в которой тебе неизвестно количество и название полей?
ем не устраивает таблица Номенклатура|Дата|Признак ? |
|||
19
MegaKent2
21.08.12
✎
18:52
|
(17) думаю тебе стоит делать запрос динамически кодом.
(18) а они скорее всего потом к ней данные привязывают ... типа продажи и т.п. |
|||
20
mrd2006
21.08.12
✎
18:52
|
(17) Тогда перебирай результаты и ложи их в таблицу значений, которую потом можно задать в качестве параметра
|
|||
21
DasTPID
21.08.12
✎
18:53
|
(18) Как это неизвестно? Известно! Полей будет ровно 32. Названия у них будут
Номенклатура ПризнакНа1Число ПризнакНа2Число ... ПризнакНа31Число Если число дней меньше 31 в этом месяце, ну или в регистре сведений нет данных о каком-то дне, то получаемое значение может быть ЛОЖЬ или NULL, непринципиально, но поле такое всё равно будет |
|||
22
GROOVY
21.08.12
✎
18:56
|
Тогда ничего не мешает использовать конструкцию ВЫБОР КОГДА Число=Нужное ТОГДА Признак ИНАЧЕ Ложь и группировать потом. Но ИМХО изврат какойто в задаче.
|
|||
23
DasTPID
21.08.12
✎
18:57
|
(20) Очень сильно пострадает быстродействие. Сейчас у меня в результирующем запросе участвует 9 вложенных таблиц, он выполняется около 1.5 секунд. Если разбирать хотя бы одну вложенную таблицу, то время выполнения навскидку увеличится на порядок
|
|||
24
DasTPID
21.08.12
✎
18:58
|
(22) Так в этом и вопрос - я не знаю как сгруппировать по полю с типом "булево"!
|
|||
25
DasTPID
21.08.12
✎
19:00
|
(22)
Пример: Номенклатура1 ложь ложь истина Номенклатура1 ложь истина ложь Номенклатура1 истина ложь ложь Как по-нормальному её сгруппировать по полю номенклатура? |
|||
26
DasTPID
21.08.12
✎
19:04
|
+25
по-нормальному это значит без извратов, а то мысли привести ЛОЖЬ к 0, ИСТИНА к 1, агрегатной функцией выбрать сумму или среднее или количество различных и потом её анализировать мне и самому в голову приходили |
|||
27
Dmitry77
21.08.12
✎
19:06
|
ВЫБОР КОГДА признак = истина ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК признак
и можешь хоть гагрупироваться |
|||
28
DasTPID
21.08.12
✎
19:09
|
(27) О, я ж говорю, извращенцы мыслят одинаково :) Таки надо без извратов. Например, замени булево значение на какой-нибудь справочник и твой метод уже не будет работать
|
|||
29
ChAlex
21.08.12
✎
19:11
|
Если это нужно отобразить пользователю - то СКД - все просто, элементарно, минимум программирования (можно сказать вообще без него) и кроме всего в дальнейшем не так страшно будет пользоваться СКД - совет. Лучше день потерять и за 5 минут долететь :) - советую
|
|||
30
DasTPID
21.08.12
✎
19:15
|
(29) 100% нужно положить во временную таблицу
А с СКД конечно надо бы разобраться... |
|||
31
DasTPID
22.08.12
✎
08:40
|
Мне тут подсказали, что то, что я хочу - называется перекрестный запрос
(29) Ты ж сам недавно спрашивал подобное v8: Как создать кросс-таблицу в запросе? Нашёл что-нибудь? |
|||
32
DasTPID
22.08.12
✎
17:36
|
Итак, решение:
Номенклатура, МИНИМУМ(ВЫБОР КОГДА ДЕНЬ(Дата) = 1 ТОГДА Признак ИНАЧЕ NULL КОНЕЦ) КАК ПризнакНа1Число, МИНИМУМ(ВЫБОР КОГДА ДЕНЬ(Дата) = 2 ТОГДА Признак ИНАЧЕ NULL КОНЕЦ) КАК ПризнакНа2Число, ... ГРУППИРОВАТЬ ПО Номенклатура Суть в том, что минимум из NULL и булева значения всегда будет значением (так же, как и максимум). Поэтому, группировка по номенклатуре таблицы из (25) даёт нужный результат |
|||
33
ChAlex
22.08.12
✎
19:56
|
(31) - в том то и дело, что просто в запросе универсально это не решить, если количество колонок известно, то путем соединения и группировок вообще-то можно, но может оказаться очень большие объемы данных при большом количестве колонок, поэтому для себя вопрос закрыл именно через СКД.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |