SkyRZN
@SkyRZN

Cоставить SQL запрос?

Добрый вечер! Помогите, пожалуйста, составить SQL запрос (SQL Server 2008)

На данный моммент есть следующее:
SELECT<br/>
 Data,<br/>
 Postav.Nazv,<br/>
 Schet.Shet,<br/>
 Schet.id,<br/>
 Schet.OtKogo,<br/>
 sum(Naimen.Kolvo*Naimen.Cena) AS SUMM,<br/>
 sum(Opl) AS SUMM2, <br/>
 (sum(Naimen.Kolvo*Naimen.Cena)-sum(Opl)) AS RAZN<br/>
FROM<br/>
 Schet,<br/>
 Postav,<br/>
 Naimen,<br/>
 Oplata<br/>
WHERE <br/>
 (Postav.id=Schet.OtKogo) AND <br/>
 (Naimen.Shet = Schet.id) AND<br/>
 (Oplata.Shet = Schet.id)<br/>
GROUP BY<br/>
 Schet.Data,<br/>
 Postav.Nazv,<br/>
 Schet.Shet,<br/>
 Schet.id,<br/>
 Schet.OtKogo<br/>


Проблема заключается в том что не удается нормально вывести 3 подсчитываемых поля.

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

Схема данных БД выглядит так:
8a53911715f9.jpg

Значения таблицы Naimen:
b4ef795a0030.jpg

Значения таблицы Oplata:
f9c2715e85fb.jpg

Результат запроса в текущем состояния:
4ca1c4db0f4b.jpg

Хотя должны быть в идеале следующие значчения:

id SUMM SUMM2 RAZN

3 1250 0 1250

4 200 11111 10911

5 880 100 780

19 12321 100 12221

22 4653,68 0 4653,68

Как-то вот так вообщем. Заранее спасибо!!!
  • Вопрос задан
  • 6584 просмотра
Решения вопроса 1
@wwi
так и должно происходить
Вы выбираете строку для каждого товара выбираете строку из ОПЛАТА
и соответственно она суммируется столько раз, сколько у вас есть товарных строк.

Рекомендую для более удобного чтения писать запросы через JOIN

Если по счету может быть несколько оплат вам нужно использовать подзапросы
1. Определить счет и подзапросом итог поступлений закрывающих счет
2. определить его цену = сумму (итого по Naimen)
3. вывести результат

в реальных условиях, правильнее отслеживать счета закрытые оплатами
(как минимум по признаку «счет оплачен полностью»)

В вашей схеме — вы всегда проводите расчет по всей БД без ограничений…

ниже запрос который выполнить вашу задачу (не оптимизированный):

Select QR1.*,
sum(Naimen.Kolvo*Naimen.Cena) AS SUMM,
sum(Naimen.Kolvo*Naimen.Cena) — QR.Payment AS RAZN
FROM (
SELECT
SCHET.Data,
Postav.Nazv,
Schet.Shet,
Schet.id,
Schet.OtKogo,
( Select sum(OPLATA.Opl) from Naimen Where Naimen.Shet = Schet.id ) As Payment
FROM Schet
JOIN Postav ON Postav.id=Schet.OtKogo
JOIN Oplata ON Oplata.Shet = Schet.id
GROUP BY
Schet.Data,
Postav.Nazv,
Schet.Shet,
Schet.id,
Schet.OtKogo
) QR1
JOIN Naimen ON Naimen.Shet = Schet.id
GROUP BY QR1.Data,
QR1.Nazv,
QR1.Shet,
QR1.id,
QR1.OtKogo,
QR1.Payment
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
Искренне хотел вам помочь на за 5 минут не понял чего вы всетаки хотите.
Думаю проблема в том, что вам надо исподьзовать join'ы и джойнить все к счету, это должно решить проблему дублей.

А вообще названия полей вырвиглазные, читать неприятно. За одно Schet.shet вас тот кто будет поддерживать этот код возненавидит, уж используйте одно название.

И вообще начните с чтения книг, это скучно но полезно.
Ответ написан
Комментировать
Где то так )
SELECT
  sc.data, 
  SUM(n.Kolvo * n.Cena) itogo,
  SUM(n.Kolvo * n.Cena)-IFNULL(o.opl,0) ostatok,
  o.opl,
  p.Nazv,
  sc.id
FROM
  habr.naimen n
  LEFT JOIN
  habr.schet sc
  ON sc.id = n.Schet
  LEFT JOIN habr.postav p
  ON p.id = sc.OtKogo
  LEFT JOIN habr.oplata o
  on o.Schet = sc.id
GROUP BY
  n.Schet
Ответ написан
@wwi
PS: последний QR1.Payment — лишний… он бессмысленный
Ответ написан
SkyRZN
@SkyRZN Автор вопроса
Хочется чтобы к счету который в таблиц Shet выводилась его сумма, сколько уже оплачено по нему и сколько оставалось оплатить, согласно формул:
Сумма всех наименований (кол-во * цену)
Сумма всех платежей
Разность общей суммы товаров и сколько уже оплачено.

Тоесть счет состоит из нескольких наименований, у которых прописана цена и кол-во, перемножаем цену и кол-во и складываем все наименования относящиеся только к этому счету.
Тоже самое и с оплатой, в итоге все это выводим.
Ответ написан
Комментировать
SkyRZN
@SkyRZN Автор вопроса
В частности вот кусок который прекрасно работает, но он подсчитывает только одно поле «Сумму», а надо чтобы еще появилось поле оплата, значения которое в другой таблички но всё по аналогии с этой.
SELECT
Data,
Postav.Nazv,
Schet.Shet,
Schet.id,
Schet.OtKogo,
sum(Naimen.Kolvo*Naimen.Cena) AS SUMM
FROM
Schet
LEFT OUTER JOIN Postav ON Postav.id=Schet.OtKogo
LEFT OUTER JOIN Naimen ON Naimen.Shet = Schet.id
LEFT OUTER JOIN Oplata ON Oplata.Shet = Schet.id
GROUP BY
Schet.Data,
Postav.Nazv,
Schet.Shet,
Schet.id,
Schet.OtKogo
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы