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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2014, 11:05   #1
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
Вопрос Как собрать данные с начала года. Помогите определить направление, куда копать.

Здравствуйте! Помогите, пожалуйста, выбрать способ решения задачи (цикл, курсор, или что-то еще). Мне нужно сделать хранимую процедуру, или представление (если это возможно), которая выбирает данные из трех таблиц с начала года до текущего месяца. Информация - это мероприятия по снижению себестоимости. Каждое мероприятие имеет месяц внедрения и дату окончания. В чем сложность: данные за один месяц также представляют из себя выборку информации из трех таблиц с начала года и до этого месяца. Т.е. если мне нужна инфа за март, я должна взять январь+февраль+март. Поскольку мероприятия, внесенные даже в начале года, будут действовать в течение всего года, пока не будут отменены. Таким образом, чтобы мне выбрать информацию с начала года и по март месяц, мне нужно взять:
январь (мероприятия, которые начали действовать с января)
январь+февраль
январь+февраль+март
И все это объединить.
каким образом можно организовать объединение подобных выборок? В какую сторону смотреть: цикл, курсор или что еще? Нужна ваша помощь!!!!
Swatch вне форума Ответить с цитированием
Старый 09.04.2014, 11:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

честно говоря, не понял, чем Вас не устраивает обычный SQL SELECT
Код:
select * from ... 
where  year(датаМероприятия) = 2014  and month(датаМероприятия) < 4
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2014, 11:17   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Все делается запросом. Куда его - в процедуру или представление это уже конкретная реализация. Курсоры и циклы крайне не эффективны. Для запроса нужны структуры таблиц, связи, если есть, и что и из какой выбирается. Показывайте. И какая СУБД
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.04.2014, 11:18   #4
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Таким образом я возьму данные только за 1 месяц. Т.е.
март=январь+февраль+март
а чтобы взять еще и февраль и январь, нужно
данные за январь
объединить с
данными за февраль=январь+февраль
объединить с
данными за март=январь+февраль+март
Т.е. в итоговое таблице у меня данные за январь должны попасть в расчет 3 раза, за февраль 2 раза.

Последний раз редактировалось Swatch; 09.04.2014 в 11:25.
Swatch вне форума Ответить с цитированием
Старый 09.04.2014, 11:22   #5
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

СУБД Access, Данные на SQL Server 2000.
Исходные данные:
Мероприятия по снижению себестоимости на детали
Мероприятия по снижению себестоимости на автобусы
Мероприятия по снижению себестоимости на кузова
Всего 3 таблицы.
Структура у них одинаковая:
Обозначение детали/автобуса/кузова, Название мероприятия, Месяц внедрения мероприятия, Дата окончания мероприятия, Расходы было, Расходы стало.

Последний раз редактировалось Swatch; 09.04.2014 в 11:30.
Swatch вне форума Ответить с цитированием
Старый 09.04.2014, 11:27   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если Вы укажите в select'е получить данные за все месяцы с 1 по 3 (условие month(ДАтаСобытия)<4) вы получите данные за 1(один) месяц, за март??!!!!

А как же у Вас данные в таблице хранятся, что у Вас так запрос отрабатывает?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2014, 11:37   #7
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Еще раз попробую объяснить суть. Допустим мероприятие начинает действовать с января (Месяц внедрения -=1). НО оно будет действовать в течение ВСЕГО года, т.е. и в феврале, и в марте, и далее, пока не закончится год или его не закроют (Дата окончания перестанет быть Null). То есть экономию от этого мероприятия мне нужно брать именно так, как я написала.
Если я возьму данные так, как вы предлагаете, я возьму их только за март, все правильно. Потому что экономия от мероприятия, внедренного в январе, возьмется только ОДИН РАЗ, а должна взяться ТРИ РАЗА, в трех месяцах. Если это мероприятие не будет закрыто до конца года, то оно должно браться в расчет в КАЖДОМ месяце года, то есть в каждом последующем месяце экономия от внедренных мероприятий будет увеличиваться (все предыдущие+все, начавшие действовать в этом месяце).
Swatch вне форума Ответить с цитированием
Старый 09.04.2014, 11:40   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Странный подход. И не думаю, что правильный. Вам виднее. Так устроит:
Код:
SELECT данные за январь-март
UNION ALL
SELECT данные за январь-февраль
UNION ALL
SELECT данные за январь
Если данные за декабрь - январь 12 раз попадает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.04.2014 в 11:43.
Аватар вне форума Ответить с цитированием
Старый 09.04.2014, 11:42   #9
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Аватар, спасибо, по смыслу именно так и нужно, только нужно бы, чтобы это количество UNION-ов соответствовало текущему месяцу. Я поэтому испрашивала про цикл, здесь смысл примерно тот же, если у меня будет текущий месяц сентябрь, например, то объединений будет больше.
Swatch вне форума Ответить с цитированием
Старый 09.04.2014, 11:45   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В принципе в хранимке можно динамический запрос сделать и выполнить с помощью EXEC. Чесно - не нравится, или со структурой данных проблемы, или с логикой что-то не то
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита от виртуалки, куда копать? FleXik Общие вопросы Delphi 4 15.10.2013 12:15
нахождение высокосного года, сезона года и к-ва дне с начала года Делфи 7 (есть код программы полностью) программирование Помощь студентам 22 22.09.2013 23:59
Какой по счёту день от начала года(не работает скрипт) maxim456 JavaScript, Ajax 3 22.03.2012 09:44
Куда копать: при открытии - ругается alex77755 Microsoft Office Excel 6 07.10.2011 16:21
Internet TV: куда копать? MyasNick Мультимедиа в Delphi 2 30.12.2008 18:42