-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


Сложный простой запрос

Среда, 26 Апреля 2017 г. 16:56 + в цитатник
Здравствуйте! Опять я за советом к знатокам.
В бухгалтерской базе есть основная таблица "тУСН17" и подчиненная "тУСН17доплата".
"тУСН17" связана с "тУСН17доплата" как один ко многим

"тУСН17" содержит столбцы (с которыми надо работать, остальные пропущены):
  • Код
  • Дата
  • Аванс
  • ДатаРеализации
  • Сумма
    Дата - это дата аванса, ДатаРеализации - дата, когда была проставлена Сумма

    "тУСН17доплата" содержит столбцы
  • Код
  • КодУСН - связь с Код "тУСН17"
  • ДатаДоплаты
  • СуммаДоплаты

    Задача такая, надо подсчитать суммы на указанный период по столбцам Аванс, Сумма, СуммаДоплаты, но с учетом проставленных дат для каждого платежа. Т.е. Аванс может быть оплачен 1 января 2017, Сумма (Дата реализации) - 12 февраля, а доплаты в течении длительного времени, 1-я 15 февраля, 2-я 24 апреля....
    Если период указан на конец февраля 2017 (указывается в главной форме), то считаться должны лишь числа, даты которых меньше или равны 28 февраля 2017
    Трудно объяснить, покажу на примере, вот первая строка в таблице:

    Аванс: 20000 от 1.01.2017
    Сумма: 50000 от 12.02.2017
    Доплата1: 2000 от 15.02.2017
    Доплата2: 3000 от 24.04.2017

    вторая строка:
    Аванс: 48000 от 27.02.2017
    Сумма: 90000 от 11.04.2017
    Доплата1: 12000 от 15.04.2017
    ...
    В итоге должно получить следующее:
    Аванс: 20000 + 48000 = 68000
    Сумма: 50000
    Доплата: 2000
    остальное игнорируется

    Я долго сидел, пробовал разными способами решить эту задачу. Пришлось использовать два запроса - первый собирает данные, отфильтровывая нужное, а второй уже считает:

    Первый запрос:
    SELECT DISTINCTROW тУСН17.Код, тУСН17.№договора, тУСН17.Дата, 
    IIf([Дата]!фГлавная!ДатаПо,[Аванс],0) AS DАванс, 
    тУСН17.ДатаРеализации, IIf([ДатаРеализации]!фГлавная!ДатаПо,[Сумма],0) AS DСумма, 
    IIf(IsNull([ДатаДоплаты]),[Дата],[ДатаДоплаты]) AS DДоплаты, 
    IIf([DДоплаты]<=(Forms!фГлавная!ДатаПо),Sum(IIf(IsNull([СуммаДоплаты]),0,[СуммаДоплаты])),0) AS SumДоплаты
    FROM тУСН17 LEFT JOIN тУСН17доплата ON тУСН17.Код = тУСН17доплата.КодУСН
    GROUP BY тУСН17.Код, тУСН17.№договора, тУСН17.Дата, 
    IIf([Дата]!фГлавная!ДатаПо,[Аванс],0), тУСН17.ДатаРеализации, 
    IIf([ДатаРеализации]!фГлавная!ДатаПо,[Сумма],0), 
    IIf(IsNull([ДатаДоплаты]),[Дата],[ДатаДоплаты]), тУСН17.[Оплата100%]
    HAVING (((тУСН17.Дата)<=[Forms]![фГлавная]![ДатаПо]) AND ((тУСН17.[Оплата100%])=False)) OR 
    (((тУСН17.ДатаРеализации)<=[Forms]![фГлавная]![ДатаПо]) AND ((тУСН17.[Оплата100%])=False)) OR 
    (((IIf(IsNull([ДатаДоплаты]),[Дата],[ДатаДоплаты]))<=[Forms]![фГлавная]![ДатаПо]) AND ((тУСН17.[Оплата100%])=False))
    ORDER BY тУСН17.Код;
    


    Второй запрос:
    SELECT DISTINCTROW Sum(зУСН17остатокДни.DАванс) AS [Sum-DАванс], 
    Sum(зУСН17остатокДни.DСумма) AS [Sum-DСумма], 
    Sum(зУСН17остатокДни.SumДоплаты) AS [Sum-SumДоплаты]
    FROM зУСН17остатокДни;
    


    Но в первом запросе есть засада, он некоторые строки дублирует (подчеркнуто красным на картинке), а именно те, где есть несколько доплат (подчеркнуто зелёным) . Естественно, второй запрос дает неправильный результат. Также пришлось принять меня к записям, где доплат нет вообще (нет записей) - в таких случаях подставлял дату от аванса, а сумма = 0.

    Картинка с другого сайта.

    Подскажите, пожалуйста, что тут можно сделать? Как удалить повторяющиеся суммы?
    На всякий случай выложил урезанный вариант базы.
  • http://www.sql.ru/forum/1258464/slozhnyy-prostoy-zapros


     

    Добавить комментарий:
    Текст комментария: смайлики

    Проверка орфографии: (найти ошибки)

    Прикрепить картинку:

     Переводить URL в ссылку
     Подписаться на комментарии
     Подписать картинку