Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Запрос расчета стажа

Добрый день
Может у кого-то будут идеи как выполнить расчет по примеру на скрине
То есть, нужно по каждому сотруднику посчитать стаж без учета периода его работы на должности с кодом 4

Если бы должность 4 встречалась только первой записью (как и предполагалось, но на практике не соблюдается) то просто:
DATEDIFF(day,(select MIN(cc.start) FROM cte cc WHERE  cc.status != 4),cd.[Дата] )


Если бы должность 4 встречалась только раз то что-то на подобии:
ROUND(  (CAST( DATEDIFF( day, MIN(cu.start)OVER(PARTITION BY cu.[title]), cd.[Дата] ) as numeric(7,1))+1)/30  - 
             (CAST( DATEDIFF( day, (select MIN(cc.start) FROM cte cc WHERE cc.status = 4), (select MAX(cc.End) FROM cte cc WHERE cc.status = 4) ) as numeric(7,1))+1)/30, 1, 1)


Но реально должность 4 может встречаться больше одного раза по каждому сотруднику и не соблюдается логическая последовательность
Может кто подскажет логику

К сообщению приложен файл. Размер - 19Kb
Ответ: Макбет,
Заработался, На самом деле результат нужно записать в другую таблицу, соединенную с календарем с подневным результатом такого расчета. Но реально подсказали идею, добавил еще одно CTE, и норм.
Спасибо
Вопрос: Работа с запросами: Расчет зарплаты

Ребят, помощь нужна!

Было две лабораторные по Access'у: первую сделал, а эту, хоть убейте, не могу...
Знаю, что она простая для тех, кто в нем работает, но для меня это АД!
5 часов потратил и не ушел дальше первого пункта задания...
Помогите бога ради!


 Порядок выполнения работы:
1. Заполните БД, чтобы в табеле содержались сведения о работе сотрудников за 3-4 месяца, и в каждом месяце не менее 4-5 человек.
 Все запросы создавайте в конструкторе. Создайте следующие запросы:
2. «Зарплата по месяцам» с информацией о полной зарплате (начислено, удержано, к выдаче) по каждому отработанному месяцу.
3. Измените предыдущий запрос так, чтобы выдавались сведения о средней зарплате в месяц. «Среднемесячная зарплата».
4. Запрос «Штатное расписание», рассчитайте количество человек на каждой должности.
5. Запрос «Минимальная зарплата», отберите сотрудников, у которых зарплата меньше средней по организации. Запрос выполняется в два этапа. На первом вычисляется средняя зарплата по организации. На втором этапе - основной запрос.
6. Перекрестный запрос «Отчет по отработанным дням». По столбцам отобразите месяцы, по строкам - ФИО, в качестве значений - среднее количество отработанных дней.
7. Запрос «Создание» на создание таблицы «Расчет зарплаты».
8. Запрос «Удаление» на удаление записей из таблицы «Расчет зарплаты». Удалить все записи о сотрудниках с суммой к выдаче меньше 15000.
9. Отчет « Ведомость на выдачу зарплаты».
Ответ:
Сообщение от alvk
...Я не в состоянии столько смеяться...
А я бы, ещё поржал и похихикал.
Вопрос: SQL запрос

База данных «Данные_ЛР2_4.mdb» описывает оптовую торговлю. Каждая запись таблицы «Покупатели» характеризует одного оптового покупателя. Каждая запись таблицы «Продажи» содержит общие характеристики продажи «Номер договора», «Дата», «Код покупателя», «Предоплата_проц». Для одного покупателя может быть выполнено несколько продаж. Состав продажи определяется несколькими записями таблицы «Проданные товары». Все такие записи имеют одинаковый номер договора.
Посредством MS Query, Access
III. Построить следующие запросы:
a. Запрос «Договоры за определенный период» должен вычислять таблицу с полями: «Номер договора», «Дата», «Форма собственности», «Покупатель», «Стоимость договора». Каждая запись содержит данные о договоре, выполненном в период, определенные параметрами «Начальная дата» и «Конечная дата». Данные должны быть отсортированы по покупателям.
b. Запрос «Продажа товаров за год» должен вычислять таблицу с полями: «Группа товаров», «Товар», «Единица измерения», «Количество проданных за год единиц товара», «Средняя цена продаж за год», «Вес проданного за год товара(Кг)», «Стоимость проданного за год товара», «Количество договоров на продажу товара за год». Каждая запись описывает продажу одного товара за год. Таблица должна содержать данные о продажах за год, определенный параметром «Год».
c. Запрос «Расчеты с покупателями за определенный период» должен вычислять таблицу с полями: «Форма собственности», «Покупатель», «Стоимость купленного за период товара», «Количество договоров за период». Каждая запись содержит данные о покупателе и покупках, выполненных за период, определенные параметрами «Начальная дата» и «Конечная дата».
d. Запрос «Стоимости покупок в зависимости от форм собственности покупателя» должен вычислять таблицу с полями: «Форма собственности», «Стоимость купленного товара», «Количество договоров». Каждая запись описывает характеристики покупок, сделанных покупателями определенной формы собственности.
e. Запрос «Поступление денег из банков за определенный период» должен вычислять таблицу с полями: «Банк», «Поступившая за период сумма». Каждая запись содержит данные о поступившей из определенного банка сумме в счет уплаты за проданные товары. Период определяется параметрами «Начальная дата» и «Конечная дата».
f. Перекрестный запрос «Покупатели - товары». Колонки должны соответствовать покупателям, строки - товарам. В клетке на пересечении строки для некоторого товара и столбца некоторого покупателя должна быть стоимость данного товара, купленного данным покупателем.
g. Запрос «Определение динамики стоимости покупок» должен формировать таблицу с полями «Покупатель», «Год», «Расхождение с предыдущим годом». Каждая запись описывает отличие суммы, затрачиваемой покупателем в очередном году, от затрат предыдущего года.
Помогите пожалуйста, очень срочно надо!!!!
Ответ: Anastasia98kisa,
в Вашей базе нет ни одной связи и,грубо говоря, она не отличается от таблиц Exel
А чем,конкретно,Вас не устраивает предложенный вариант?(он позволяет создать почти все нужные запросы, а с добавлением таблицы "платежи"-все)
Вопрос: Запрос расчет остатка деталей

Подскажите как правильно создать запрос на получение остатка по деталям с группировкой по весу, заказу, цеху.


В базе есть 2 таблицы приемка и сдача для отображения движения деталей на производстве.

В связи с необходимостью переброски деталей с одного заказа на другой учет ведется в 2 таблицах.

Разница в них иногда в номере заказа.
Например деталь 1 числиться на заказе номер 2 в количестве 10 штук.
Приходит на обработку служебная записка согласно которой нужно перебросить деталь 1 в кол-ве 2 шт с заказа 2 на заказ 8.

В таком случае добавятся по строке в таблицу приемка и сдача.
В сдаче номер заказа будет 2, а в приемке 8.

Запрос ОстатокДетальЗаказ подсчитывает остаток в кол-ве, но без учета веса используя запрос ЦехДетальЗаказ (получаю максимальное количество комбинаций для связки запросов приход и расход).
Ответ: Вес в базе указан, при перемещении учитывается
Вопрос: Расчет стоимости в БД access

Нужна помощь ни как не могу справиться с этими запросами, база в приложении

Запросы с вычисляемыми полями
Создать запрос Расчет стоимости. Стоимость вычисляется как произведение цены товара на количество. Если количество товара меньше заданного (например, 10 шт.), берется розничная цена, иначе – оптовая. Для расчета цены использовать функцию Iif. Поля запроса: Номер заказа, Наименование товара, Количество, Цена, Стоимость заказа. Сортировка записей – по номерам заказов.
Итоговые запросы
Создать запрос, вычисляющий суммарную стоимость заказов на товары каждой фирмы. Группировка – по полю Фирма-производитель. Суммирование – по полю Стоимость заказа. Сортировка – по названиям фирм.
Перекрестные запросы
Создать перекрестный запрос, подсчитывающий количество товаров каждой фирмы, заказанных каждым клиентом. Использовать в качестве заголовков столбцов фамилии клиентов, заголовков строк – названия фирм. Суммирование – по полю Количество.
Ответ: Имена/структуру таблиц и их связи нужно угадать?
Вопрос: Запрос подсчет сальдовой ведомости

Нужно получить оборотную ведомость по счетам за месяц.

Таблица оборотка одна на весь отчетный период и местит в себе поле месяц.
Нужно узнать остаток на начало месяца используя поле на главной форме, узнать оборот за текущий, и конечный остаток.

Все сделал при помощи 3-х запросов. Расчет идет верно, но при этом куча пустых строк. Подскажите как их убрать ?

Запрос ОбороткаСчет.

Всех счетов в остатке может и не быть, как и в отчетном месяце
поэтому связи именно такие.
Ответ: Повлияет.

Обычно для уменьшения объемов обсчета придусматривают процедуру "закрытия периода". То есть, время от времени делается глобальная сверка (с бухгалтерами, складеом и тп), исправляются все найденные расхождения и принимается административное решение, что "период до даты такой-то закрывается". После чего все остатки на данную дату считаются начальными, документы ранее этой даты становятся либо вовсе недоступны, ли доступны только на чтение (чаще всего первое - т.к. сбрасываются в архив и удаляются из актуальной базы).

Добавлено через 2 часа 9 минут
Боже, как стыдно за опечатку. Предусматривают, конечно же.
Вопрос: В перекрестном запросе в названии столбцов цифры

Добры день! Возникла проблема: при создании перекрестного запроса вместо наименований цветов изделия в заголовках столбцов выводятся их номера (id). Подскажите как вывести вместо id именно названия?

Запрос:
Код SQL
1
2
3
4
5
TRANSFORM SUM(Расчет.Итого) AS [Sum-Итого]
SELECT Расчет.name, SUM(Расчет.Итого) AS [Итоговое значение Итого]
FROM Расчет
GROUP BY Расчет.name
PIVOT Расчет.color_izd;
Ответ: vek8, если перекрестный запрос сделан из обычного запроса, то необходимо проверить, чтобы названия полей запроса были не из результирующей таблицы, а из таблиц справочников. то есть надо эти таблицы добавить в результирующий запрос, они должны соединиться связями. поставить нужно имена полей справочных-дочерних таблиц. затем сделайте перекрестный запрос или поправьте эти.
Вопрос: Оптимизация кода запроса в Access 2010

Есть база данных с таблицей и запросом, запрос вычисляет столбец Difference, но работает очень медленно, если использовать его в большой таблице. Помогите, пожалуйста, оптимизировать код этого запроса:
SQL
1
2
3
4
5
6
7
SELECT П1.Code, П1.FIELD, П1.NUMBER, П1.DATA, [П1].[NUMBER]-(SELECT П3.NUMBER FROM [TABLE] AS П3 
        WHERE П3.FIELD = П1.FIELD                                                            
        AND П3.DATA = (SELECT MAX(DATA)                                                                           
        FROM [TABLE] AS П2                                                                           
        WHERE П2.FIELD = П1.FIELD AND П1.DATA > П2.DATA)) AS Difference
    FROM [TABLE] AS П1
    ORDER BY П1.FIELD, П1.DATA;
Ответ: Индексы это безусловно. Но положения не спасет, выигрыш во времени будет непринципиален. Дело в том, что сложность запроса более чем кубическая, что вроде O(4) от количества записей, поскольку в селекте подзапрос который в свою очередь обращается к подзапросу типа нарастающий максимум. А он сам, этот последний подзапрос имеет сложность пропорциональную O(2). Решение может быть прежде всего в изъятии самого внутреннего (и самого тяжелого) подзапроса и замена его на подготовленную заранее вспомогательную таблицу. Тогда вместо О(4) получим О(2)+О(2). И тем самым квадратично уменьшим время.
В предлагаемом варианте создана вспомогательная таблица Temp в которую запросом AddTemp помещаются рассчитанные значения максимальной даты меньше текущей для заданного field. А в запросе CalcQuery, вместо самого внутреннего подзапроса используется поле mData из т.Temp приджойненой к [table].
В таблице показано время расчета в экспериментах на автоматически сгенерированных выборках. На реальных данных время может быть иное - скажется квадратичная зависимость при заполнении Temp
Количество записей Время, сек.
4000.08
10000.3
20001.1
40003.5
1000022.0
2000084.0

Для удобства пользования сделана форма с кнопкой для запуска расчета. Но можно и без формы. Надо последовательно запустить 3 запроса:
1. DeleteTemp
2. AddTemp
3. CalcDiffer

Если у фактической таблицы иное имя и поля иначе называются, то надо исправить запросы AddTemp и CalcDiffer. А также поправить имя таблицы в функции CalcDiff в модуле формы. Строка где надо исправить помечена комментарием.

Запрос1 просто запрос показывающий количество записей в группах по field.
В таблице Temp пустые поля рассчитанной даты заменены #31/12/1899# поскольку с нуллом запрос выходил на ошибку. Вплоть до аварийного выхода из программы.

Тип БД заменен на mdb. Превратить обратно в accdb несложно.
Вопрос: Алгоритм для расчета пени в VBA

Есть ранжированный по датам запрос, где находятся выставленные платежи (1) и проплаты (2).
Дата выставленного платежа и есть день с которого начисляем пеню.



Ч-з код ВБА хочу посчитать пеню на текущий день и долг, которые необходимо выгрузить в таблицу



Никак не могу продумать алгоритм расчета. Платежи могут идти в разнобой, несколькими суммами, пеню могут оплатить и в основном платеже, а не отдельно. Изначально платежи должны гасить основной долг, затем пеню.

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

Нижеприведенный код не претендует на правильность, просто выбранное направление движения в расчете.
+
Oplatit = 0
Oplata = 0

Set rcdPlateji = CurrentDb.OpenRecordset("Пеня2")
rcdPlateji.MoveFirst 'на первую запись
Do While Not rcdPlateji.EOF 'просмотр всего запроса Пеня2

    KodStudend = rcdPlateji![КодСтудента]
    PenjaSumm = 0
    Do While rcdPlateji![КодСтудента] = KodStudend ' просмотр всех платежек для студента

                    If rcdPlateji![ТипПлатежки] = 1 Then
                    Oplatit = Oplatit + rcdPlateji![СуммаПлатежа]
                    OplataPo = rcdPlateji![ДатаПлатежа]
                    Else
                    Oplata = Oplata + rcdPlateji![СуммаПлатежа]
                    PlategkiOt = rcdPlateji![ДатаПлатежа]
                    End If
                    
                    If Dolg > 0 And Oplata > 0 Then
                    KOlDni = DateDiff("d", OplataPo, PlategkiOt)
                    Penja = Dolg * KOlDni * 0.001
                    PenjaSumm = Penja + PenjaSumm
                    Dolg = Oplatit - Oplata
                    End If

    rcdPlateji.MoveNext
    Loop

Loop



ПС: сам по образованию не программист, ищу похожие образцы кода и пытаюсь адаптировать к своим нуждам. В данном случае застрял((.
Ответ:
forestry96
Вот допустим, что считает мне запрос

165 дней просрочки?
А сколько? Если оплатитьДо=01.03, а ДатаПлатежа=26.08
Вопрос: SSAS 2012, расчет сумм по группировкам очень долгий, как ускорить?

Надо в отчете получить продажи в разрезе Типов каналов сбыта - [ТипыКС].[ТипКС], Каналов Сбыта - [КС].[Канал сбыта], Брендов - [Бренды].[Бренд]. Для каждой группы надо получить долю в доходе группы. Т.е. для группы 1-го уровня (Типов каналов сбыта) надо получить общий итог по всем 3-м группам, для группы второго уровня надо получить данные по каждому элементу (Типов каналов сбыта) и по всем Каналам сбыта и брендам, для группы третьего уровня - по каждому типу каналов сбыта и по каждому каналу сбыта, но по всем брендам:

Сделал такой запрос чтобы получить доходы по всем уровням трех группировок:
WITH

MEMBER [Measures].[Себестоимость доставка] AS 
	[Measures].[Себестоимость Затраты Дол] - [Measures].[Себестоимость Дол]

MEMBER [Measures].[Доход Доля ТипКС] AS 
      Sum(
        ([ТипыКС].[ТипКС].[All],[КС].[Канал сбыта].[All],[Бренды].[Бренд].[All]
		)
       ,[Measures].[Доход Дол])

MEMBER [Measures].[Доход Доля ТипКС КС] AS 
      Sum(
        ([ТипыКС].[ТипКС].[All],[КС].[Канал сбыта].[All],[Бренды].[Бренд].CurrentMember
		)
       ,[Measures].[Доход Дол])

MEMBER [Measures].[Доход Доля ТипКС КС Бренд] AS 
      Sum(
        ([ТипыКС].[ТипКС].[All],[КС].[Канал сбыта].CurrentMember,[Бренды].[Бренд].CurrentMember
		)
       ,[Measures].[Доход Дол])
 

SELECT 
  NON EMPTY 
    {
    
     [Measures].[Доход Дол]
     ,[Measures].[Прибыль С Затратами Дол]
     ,[Measures].[Количество]
     ,[Measures].[Себестоимость Дол]
     ,[Measures].[Себестоимость Затраты Дол]
     ,[Measures].[Себестоимость доставка]
     ,[Measures].[Доход Доля ТипКС]
     ,[Measures].[Доход Доля ТипКС КС]
     ,[Measures].[Доход Доля ТипКС КС Бренд]
    } ON COLUMNS
 ,NON EMPTY
	{
    ([ТипыКС].[ТипКС].Children,
	[КС].[Канал сбыта].Children
	,[Бренды].[Бренд].Children
	)
	} ON ROWS

FROM 
	[Нов_Продажи]
WHERE 
  ([Предприятия].[Группа-Предприятие].&[Фирма1],[Календарь].[Год-Месяц].[Год].&[2015-01-01T00:00:00].&[2015-10-01T00:00:00]
)


Он выполняется очень долго. Если убрать расчетные поле [Measures].[Доход Доля ТипКС] ,[Measures].[Доход Доля ТипКС КС] ,[Measures].[Доход Доля ТипКС КС Бренд] из выборки - запрос выполняется за 5 секунд, если оставить - выполняется десятки минут.
Подскажите может есть решение ускорить такой запрос? Заранее спасибо.
Ответ: Пока решил так. Вынес расчет в КУб как расчетные поля, формулу расчета изменил:



MEMBER [Measures].[Доход Доля ТипКС] AS 
      IIF([Measures].[Доход Дол] <> 0,Sum(
        ([ТипыКС].[ТипКС].[All],[КС].[Канал сбыта].[All],[Бренды].[Бренд].[All]
		)
       ,[Measures].[Доход Дол]),NULL)

MEMBER [Measures].[Доход Доля ТипКС КС] AS 
      IIF([Measures].[Доход Дол] <> 0,Sum(
        ([ТипыКС].[ТипКС].[All],[КС].[Канал сбыта].[All],[Бренды].[Бренд].CurrentMember
		)
       ,[Measures].[Доход Дол]),NULL)

MEMBER [Measures].[Доход Доля ТипКС КС Бренд] AS 
      IIF([Measures].[Доход Дол] <> 0,Sum(
        ([ТипыКС].[ТипКС].[All],[КС].[Канал сбыта].CurrentMember,[Бренды].[Бренд].CurrentMember
		)
       ,[Measures].[Доход Дол]),NULL)


Что позволило избавиться от итогов по данным где не было продаж.