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

Откуда:
Сообщений: 271
Что-то не могу получить ожидаемый результат
Имеется таблица
Тип Договор Сумма_по_договору Сумма_платежа
Банк 5454445 10200.20 120.25
Банк 5454445 10200.20 100.15
Банк 5774111 520.00 520.00

Выгружаю с таблицы проводок, где договор может быть указан несколько раз, если было несколько платежей. При этом значение в поле "Сумма_по_договору" будет без изменений.
Мне нужно получить среднее значение поля "Сумма_по_договору" в разрезе значений поля "Тип"

Делал так
 SELECT  t.SalesMode,avg(SumPaymentTotal) as 'ср'
 FROM [data].[dbo].[76] t
 GROUP BY t.SalesMode


Для контроля отдельно выгрузил список договоров
 SELECT distinct  t.SalesMode,t.contractnumber,SumPaymentTotal
 FROM [data].[dbo].[76] t
 
и вывел среднее в сводной екселя. Предполагаю этот набор значений эталонным.
Результат первого запроса отличается
Как его правильно создать?
2 июн 15, 17:50    [17721774]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
Glory
Member

Откуда:
Сообщений: 104760
2viper2viper
Как его правильно создать?

Для этого нужно как минимум знать, какой результат для вас является правильным
2 июн 15, 17:53    [17721784]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
Как его правильно создать?

Для этого нужно как минимум знать, какой результат для вас является правильным


средне значения поля "Сумма_по_договору" в разрезе значений поля "Тип". Записи договоров со значением этого поля могут быть указаны несколько раз, нужно выбрать уникальный набор и сверять в нем.. Блин.. не подумал, может через подзапрос? а он и будет выгружать эти уникальные значения...
2 июн 15, 18:00    [17721814]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
2viper2viper, для начала выбрать уникальные значения типа, договора и суммы по договору, затем посчитать среднее.

Это можно сделать подзапросом, например:
SELECT  t.SalesMode,avg(SumPaymentTotal) as 'ср'
from (SELECT distinct  t.SalesMode,t.contractnumber,SumPaymentTotal
 FROM [data].[dbo].[76] t) as t
GROUP BY t.SalesMode
2 июн 15, 18:01    [17721820]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
2viper2viper,

зачем Вам номер контракта, если Вы ищете среднее по типу?
И почему Вы решили, что среднее по

(10200.20),(10200.20),(520.00)

это тоже самое, что среднее по

(10200.20),(520.00)?
2 июн 15, 18:03    [17721828]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20609
2viper2viper
Выгружаю с таблицы проводок, где договор может быть указан несколько раз, если было несколько платежей. При этом значение в поле "Сумма_по_договору" будет без изменений.
Мне нужно получить среднее значение поля "Сумма_по_договору" в разрезе значений поля "Тип"

Я верно понимаю, что для нескольких записей с одинаковым номером договора и, соответственно, суммы по нему, при подсчёте среднего сумма должна учитываться только один раз?
В таком случае рекомендую в подзапросе сгруппировать сперва по договору и сумме, и уже на этом подзапросе считать среднее.
SELECT  t.SalesMode, AVG(t.SumPaymentTotal) AS cp
FROM ( SELECT DISTINCT SalesMode, ContractNumber, SumPaymentTotal
       FROM [data].[dbo].[76]
     ) t
GROUP BY t.SalesMode

Теоретически вроде бы можно и AVG(DISTINCT SumPaymentTotal) - но где гарантия, что сумма по разным договорам не совпадёт до копейки...
2 июн 15, 18:03    [17721830]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Minamoto
2viper2viper, для начала выбрать уникальные значения типа, договора и суммы по договору, затем посчитать среднее.

Это можно сделать подзапросом, например:
SELECT  t.SalesMode,avg(SumPaymentTotal) as 'ср'
from (SELECT distinct  t.SalesMode,t.contractnumber,SumPaymentTotal
 FROM [data].[dbo].[76] t) as t
GROUP BY t.SalesMode


Так и сделал. Спасибо Вам.

Glory натолкнул на мысль вопросом ))
2 июн 15, 18:04    [17721832]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20609
А ещё я бы проконтролировал отсутствие записей с одинаковым ContractNumber и различающимся SumPaymentTotal - если, конечно, на таблице нет такого constraint.
2 июн 15, 18:04    [17721835]     Ответить | Цитировать Сообщить модератору
 Re: Среднее  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Akina
А ещё я бы проконтролировал отсутствие записей с одинаковым ContractNumber и различающимся SumPaymentTotal - если, конечно, на таблице нет такого constraint.


Так и сделал. на самом деле такие ситуации возможны. Не хотел в самой задаче усложнять и этим правилом.
Спасибо, Akina за дельный совет
3 июн 15, 10:50    [17723989]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить