Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 sql запрос  [new]
alexkl123
Member

Откуда:
Сообщений: 5
Никак не пойму как сделать запрос. Есть таблица "Оказанные услуги", есть "Оплата" этих услуг. Может быть несколько записей Оплаты на одну Оказанную услугу, может не быть вообще. В Оказанных услугах есть Код клиента. Нужно сделать выборку "Код клиента" и его долг (СтоимостьУслуги - сумма его платежей).

SELECT [Оказанные услуги].КодКлиента, Sum(Оплата.СуммаОплаты) AS paid
FROM [Оказанные услуги] LEFT JOIN Оплата ON [Оказанные услуги].Код = Оплата.КодУслуги
GROUP BY [Оказанные услуги].КодКлиента;

куда здесь вставить Стоимость услуги, внутрь суммы не получится,будет считать неправильно, снаружи Стоимость услуги-Sum, то выражение не будет частью статистической функции или группы

Попробовал сделать так

SELECT [Оказанные услуги].КодКлиента, ([Оказанные услуги].СуммаОплаты-Nz((SELECT Sum(Оплата.СуммаОплаты) AS [Sum-СуммаОплаты] FROM [Оплата] where Оплата.КодУслуги=[Оказанные услуги].Код),0)) AS debt
FROM [Оказанные услуги], Оплата
GROUP BY [Оказанные услуги].КодКлиента, [Оказанные услуги].Код, [Оказанные услуги].СуммаОплаты;
считает правильно, но не могу сгруппировать по Коду клиента, если убрать из группировки Код и Сумму Оплаты, тогда вложенный селект будет ругаться
30 июл 18, 11:33    [21613792]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6259
alexkl123,
это очень примерно,но схема должна быть примерно такой(естессно вынести перечень услуг со стоимостью в отдельную таблицу):

К сообщению приложен файл (tmp1.rar - 13Kb) cкачать
30 июл 18, 12:04    [21613974]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
982183
Member

Откуда: VL
Сообщений: 3120
Лефтджоин не забудь.
Иначе из выборки пропадут клиенты с начислениями, но без оплат.
30 июл 18, 12:43    [21614194]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
alexkl123
Member

Откуда:
Сообщений: 5
sdku,

Спасибо, но это примерно, что у меня вверху. Получить сумму оплат по услуге - не проблема. Но нужно добавить в таблицу Услуги стоимость этой услуги и брать не сумму оплат, а стоимость услуги - сумма оплат. Вот это я не пойму как сделать.
30 июл 18, 13:01    [21614325]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6259
982183,
прошу пардону-забыл
30 июл 18, 13:08    [21614357]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
982183
Member

Откуда: VL
Сообщений: 3120
А я что-то проблемы не понял
Должно работать в простейшем виде:

SELECT Оплата.Клиент, 
            Sum(Услуги.Отгрузка) AS Отгрузка,
            Sum(Оплата.оплата) AS Оплата,
            Sum(Услуги.Отгрузка)-Sum(Оплата.оплата) AS Долг
FROM Оплата, Услуги
WHERE Оплата.Клиент=Услуги.Клиент
GROUP BY Оплата.Клиент


Где проблема начинается?
30 июл 18, 13:37    [21614541]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6259
alexkl123
Но нужно добавить в таблицу Услуги стоимость этой услуги и брать не сумму оплат, а стоимость услуги - сумма оплат. Вот это я не пойму как сделать.

на форме должно быть поле со списком [услуги],которое "проглотит" только то значение которое есть в таблице [услуги], если же в него вводить значение отсутствующее в таблице [услуги]то надо обработать событие "отсутствиеВсписке" для этого combo.
Примерно так:
Private Sub Услуга_NotInList(NewData As String, Response As Integer)
    
    ' Добавляет новый тип при вводе с клавиатуры
    ' в поле со списком "Услуга".

    Dim intNewCategory As Integer, intTruncateName As Integer, strTitle As String, intMsgDialog As Integer

    ' Выводит окно сообщения с приглашением подтвердить
    ' добавление нового типа.
    strTitle = "Услуга отсутствует в списке"
    intMsgDialog = vbYesNo + vbQuestion + vbDefaultButton1
    intNewCategory = MsgBox("Добавить новую?", intMsgDialog, strTitle)

    If intNewCategory = vbYes Then
        ' Удаляет новое имя из поля "Ваше combo(услуга)", позволяя выполнить.
        ' обновление элемента управления при возвращении в форму.
        DoCmd.RunCommand acCmdUndo

       
        ' Открывает форму "ДобавлениеУслуги". Ваша форма для добавления услуги
        DoCmd.OpenForm "ДобавлениеУслуги", acNormal, , , acAdd, acDialog, NewData
        
        ' Продолжение без вывода стандартного сообщения об ошибке.
        Response = acDataErrAdded
    End If

End Sub


'в форме для добавления услуги
 Private Sub Form_Load()
            Me!услуга= Me.OpenArgs 'новая услуга
         
End Sub
30 июл 18, 13:50    [21614620]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
alexkl123
Member

Откуда:
Сообщений: 5
982183,

Считает неправильно. Допустим на одну отгрузку две оплаты. Тогда будет считать Отгрузка-Оплата1 + Огрузка-Оплата2, Отгрузку берет столько раз сколько оплат, а должно быть Отгрузка - (Оплата1+Оплата2), такое чувство что нужно distinct куда-то прилепить.
30 июл 18, 13:52    [21614634]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6259
вдогонку:если в таблицу нужно добавить запись содержащую одно поле(но это не Ваш случай-кроме наименования услуги будет второе поле-её стоимость) можно не создавать форму для добавления а в процедуре добавить запись в таблицу запросом
30 июл 18, 13:58    [21614678]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
982183
Member

Откуда: VL
Сообщений: 3120
Ну так, если не умеешь делать составные запросы,

Напиши сначала запрос "Оплаты"
SELECT Оплата.Клиент, Sum(Оплата.оплата) AS Оплата
FROM Оплата
GROUP BY Оплата.Клиент;


А в основном запросе обратись к нему.
SELECT Оплаты.Клиент, Sum(Услуги.Отгрузка) AS Отгрузка,
 Sum(Оплаты.оплата) AS Оплата,
 Sum(Услуги.Отгрузка)-Sum(Оплаты.оплата) AS Долг
FROM Оплаты, Услуги
WHERE Оплаты.Клиент=Услуги.Клиент
GROUP BY Оплаты.Клиент;
30 июл 18, 14:01    [21614692]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
alexkl123
Member

Откуда:
Сообщений: 5
sdku,

Да у меня уже есть готовые таблицы с данными, мне нужно просто сделать выборку при помощи sql для отчета.
30 июл 18, 14:04    [21614712]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос  [new]
alexkl123
Member

Откуда:
Сообщений: 5
Всё, разобрался. Спасибо за помощь!
30 июл 18, 14:36    [21614927]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить