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

Откуда:
Сообщений: 271
Добрый день форумчане
Подскажите пожалуйста как правильно построить запрос, чтобы извлекал значения "Общая премия" без суммирования, а "Платеж" - суммируя?
Поскольку по некоторым договорам существует разбивка на несколько платежей, то обычным суммированием исказится значение поля "Общий платеж"

К сообщению приложен файл. Размер - 54Kb
9 сен 14, 18:21    [16556123]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
VGalamakh
Member

Откуда: Киев (Альба)
Сообщений: 66
ввроде нет такого поля "Общая премия"

А вообще - добавте поле в группировку.
9 сен 14, 18:57    [16556248]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Подскажите пожалуйста как правильно построить запрос,

А где текущий запрос то ?
9 сен 14, 22:01    [16556733]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

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

А где текущий запрос то ?

select Нов.договор,ФИО,Дата,[Дата платежа],[Общий платеж],[Текущий]
from bd1.dbo.payment
group by Нов.договор,ФИО,Дата,[Дата платежа],[Общий платеж],[Текущий]

выгружается без суммирования поля [Текущий] (двумя и более строками, как в исходнике)


select Нов.договор,ФИО,Дата,[Дата платежа],[Общий платеж],sum([Текущий])
from bd1.dbo.payment
group by Нов.договор,ФИО,Дата,[Дата платежа],[Общий платеж]

выгружается завышенное значение поля [Текущий]
10 сен 14, 10:47    [16557913]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
выгружается завышенное значение поля [Текущий]

С чего вдруг ?
Приведите исходные тестовые данные
10 сен 14, 10:51    [16557933]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Запрос:
declare @datecontractfrom nvarchar (8), @datecontracttill nvarchar (8)
set @dateCONTRACTfrom = '20140701'
set @dateCONTRACTtill = '20140731'

			select t2.ContractNumber as 'Нов.договор',t2.Client as 'Клиент',t2.datecontract as 'Дата нов.дог.',
			t2.DatePosting as 'Дата платежа',t2.lb1 as 'Канал нов',t1.lb1 as 'Канал предыд',t2.[Payment] as 'Платеж'
		,t2.SumPaymentTotal as 'Платеж по договору'
			  
             FROM [DATA].[dbo].[76] as t1
                inner join [DATA].[dbo].[76] as t2 on t1.[Client]=t2.[Client] and t1.[Vid]=t2.[Vid] and t1.[RegistrationNumber]=t2.[RegistrationNumber]
			 where (t2.[ContractNumber] != t1.[ContractNumber])   
				and (t2.[DatePosting] between @dateCONTRACTfrom and @dateCONTRACTtill)
				and t2.vid like N'Карты' 	
		        and (datediff(day, t1.DateEnd, t2.DateContract) <= 30) 
			group by t2.ContractNumber,t2.Client ,t2.datecontract,t2.DatePosting,t2.lb1,t1.lb1,t2.[Payment],t2.SumPaymentTotal

возвращает результат в виде отдельных строк по каждой записи, не суммируя поле t2.[Payment]

К сообщению приложен файл. Размер - 87Kb
10 сен 14, 11:40    [16558223]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Запрос:

Нужны исходные тестовые данные, которые после выполнения запроса покажут " завышенное значение поля [Текущий]"
10 сен 14, 11:45    [16558275]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
При запросе:
declare @datecontractfrom nvarchar (8), @datecontracttill nvarchar (8)
set @dateCONTRACTfrom = '20140701'
set @dateCONTRACTtill = '20140731'

			select t2.ContractNumber as 'Нов.договор',t2.Client as 'Клиент',t2.datecontract as 'Дата нов.дог.',
			t2.DatePosting as 'Дата платежа',t2.lb1 as 'Канал нов',t1.lb1 as 'Канал предыд',sum(t2.[Payment]) as 'Платеж'
		,t2.SumPaymentTotal as 'Платеж по договору'
			  
             FROM [DATA].[dbo].[76] as t1
                inner join [DATA].[dbo].[76] as t2 on t1.[Client]=t2.[Client] and t1.[Vid]=t2.[Vid] and t1.[RegistrationNumber]=t2.[RegistrationNumber]
			 where (t2.[ContractNumber] != t1.[ContractNumber])   
				and (t2.[DatePosting] between @dateCONTRACTfrom and @dateCONTRACTtill)
				and t2.vid like N'Карты' 	
		        and (datediff(day, t1.DateEnd, t2.DateContract) <= 30) 
			group by t2.ContractNumber,t2.Client ,t2.datecontract,t2.DatePosting,t2.lb1,t1.lb1,t2.SumPaymentTotal

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

К сообщению приложен файл. Размер - 77Kb
10 сен 14, 11:46    [16558285]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
значения поля "Платеж" преобретают не верное значение (завышенное).

У вас во всех запросах уже есть group by
Что говорит о том, что исходных записей больше.
Если вы хотите суммировать только то, что попало в 1ый запрос, то тогда нужно делать вложенные запросы, а не добалять sum и менять group by
10 сен 14, 11:50    [16558316]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
Запрос:

Нужны исходные тестовые данные, которые после выполнения запроса покажут " завышенное значение поля [Текущий]"


К сообщению приложен файл. Размер - 62Kb
10 сен 14, 11:51    [16558324]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
значения поля "Платеж" преобретают не верное значение (завышенное).

У вас во всех запросах уже есть group by
Что говорит о том, что исходных записей больше.
Если вы хотите суммировать только то, что попало в 1ый запрос, то тогда нужно делать вложенные запросы, а не добалять sum и менять group by

через cross apply?
10 сен 14, 11:54    [16558347]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Glory
пропущено...

Нужны исходные тестовые данные, которые после выполнения запроса покажут " завышенное значение поля [Текущий]"


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

Вы отличаете исходные данные от результата запроса ?
Вы упорно постите резултат запроса с group by t2.ContractNumber,t2.Client ,t2.datecontract,t2.DatePosting,t2.lb1,t1.lb1,t2.[Payment],t2.SumPaymentTotal
в котором уже меньше данных, чем в запросе без group by
10 сен 14, 11:55    [16558355]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
пропущено...


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

Вы отличаете исходные данные от результата запроса ?
Вы упорно постите резултат запроса с group by t2.ContractNumber,t2.Client ,t2.datecontract,t2.DatePosting,t2.lb1,t1.lb1,t2.[Payment],t2.SumPaymentTotal
в котором уже меньше данных, чем в запросе без group by


это и есть исходные данные, по которым нужно сверить факт лонгации договора
Исходные данные являются построчными записями по каждому платежу.
поэтому резултат запроса с group by t2.ContractNumber,t2.Client ,t2.datecontract,t2.DatePosting,t2.lb1,t1.lb1,t2.[Payment],t2.SumPaymentTotal и выгружает такую же структуру результирующей таблицы (но после применения фильтра по наличии лонгации)
По задаче нужно вгрузить все поля исходных данных безх изменений, но просуммировать значения поля "Платежи" итоговым значением
10 сен 14, 12:00    [16558393]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
это и есть исходные данные, по которым нужно сверить факт лонгации договора

Исходные данные - это select * from mytable
10 сен 14, 12:03    [16558413]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
это и есть исходные данные, по которым нужно сверить факт лонгации договора

Исходные данные - это select * from mytable

вот исходник
каждая запись - отдельная проводка

К сообщению приложен файл (Книга1.xlsx - 8Kb) cкачать
10 сен 14, 12:12    [16558471]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271


К сообщению приложен файл. Размер - 108Kb
10 сен 14, 15:04    [16559655]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Задачу решено с применением вложенного запроса
Спасибо Glory

declare @datecontractfrom nvarchar (8), @datecontracttill nvarchar (8)
set @dateCONTRACTfrom = '20140701'
set @dateCONTRACTtill = '20140731'

			select t2.ContractNumber as 'Нов.договор',t2.Client as 'Клиент',t2.datecontract as 'Дата нов.дог.',
			t2.DatePosting as 'Дата платежа',t2.lb1 as 'Канал нов',t1.lb1 as 'Канал предыд'
			,t2.SumPaymentTotal as 'Платеж по договору'
			,(select sum(t3.Payment)  from [DATA].[dbo].[76] as t3 
			where t2.ContractNumber=t3.ContractNumber and t3.[DatePosting] between @dateCONTRACTfrom and @dateCONTRACTtill)  as Платеж
				  
             FROM [DATA].[dbo].[76] as t1
                inner join [DATA].[dbo].[76] as t2 on t1.[Client]=t2.[Client] and t1.[Vid]=t2.[Vid] and t1.[RegistrationNumber]=t2.[RegistrationNumber]
			 where (t2.[ContractNumber] != t1.[ContractNumber])  
				and (t2.[DatePosting] between @dateCONTRACTfrom and @dateCONTRACTtill)
				and t2.vid like N'Карта' 	
		        and (datediff(day, t1.DateEnd, t2.DateContract) <= 30) 
			group by t2.ContractNumber,t2.Client ,t2.datecontract,t2.DatePosting,t2.lb1,t1.lb1,t2.SumPaymentTotal
10 сен 14, 15:41    [16559976]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Wlr-l
Member

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

Решение задачи с использованием оконных функций:

with A as ( --эмуляция Ваших данных
 select *
   from (values (  1, '40140101',  100.00, '40140901'),
                (  1, '40140101',  100.00, '40140905'),
                (  2, '40140102',  200.00, '40140902'),
                (  3, '40140103',  100.00, '40140901'),
                (  3, '40140103',  200.00, '40140902'),
                (  3, '40140103',  300.00, '40140903'),
                (  4, '40140101',  400.00, '40140904')
        ) as T (cont,   dateCont, payment, datePayment)
)

select cont,   dateCont, payment, datePayment
      ,sum(payment) over (partition by cont) as totalPayment

 from A;


Результат:
cont	dateCont	payment	datePayment	totalPayment
1 40140101 100.00 40140905 200.00
1 40140101 100.00 40140901 200.00
2 40140102 200.00 40140902 200.00
3 40140103 200.00 40140902 600.00
3 40140103 300.00 40140903 600.00
3 40140103 100.00 40140901 600.00
4 40140101 400.00 40140904 400.00

Это пример, не привязанный к Вашим конкретным данным!
11 сен 14, 15:25    [16564363]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Wlr-l
2viper2viper,

Решение задачи с использованием оконных функций:

with A as ( --эмуляция Ваших данных
 select *
   from (values (  1, '40140101',  100.00, '40140901'),
                (  1, '40140101',  100.00, '40140905'),
                (  2, '40140102',  200.00, '40140902'),
                (  3, '40140103',  100.00, '40140901'),
                (  3, '40140103',  200.00, '40140902'),
                (  3, '40140103',  300.00, '40140903'),
                (  4, '40140101',  400.00, '40140904')
        ) as T (cont,   dateCont, payment, datePayment)
)

select cont,   dateCont, payment, datePayment
      ,sum(payment) over (partition by cont) as totalPayment

 from A;


Результат:
cont	dateCont	payment	datePayment	totalPayment
1 40140101 100.00 40140905 200.00
1 40140101 100.00 40140901 200.00
2 40140102 200.00 40140902 200.00
3 40140103 200.00 40140902 600.00
3 40140103 300.00 40140903 600.00
3 40140103 100.00 40140901 600.00
4 40140101 400.00 40140904 400.00


Это пример, не привязанный к Вашим конкретным данным!


То что нужно
Спасибо)
12 сен 14, 16:56    [16569524]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Wlr-l
2viper2viper,

Решение задачи с использованием оконных функций:

with A as ( --эмуляция Ваших данных
 select *
   from (values (  1, '40140101',  100.00, '40140901'),
                (  1, '40140101',  100.00, '40140905'),
                (  2, '40140102',  200.00, '40140902'),
                (  3, '40140103',  100.00, '40140901'),
                (  3, '40140103',  200.00, '40140902'),
                (  3, '40140103',  300.00, '40140903'),
                (  4, '40140101',  400.00, '40140904')
        ) as T (cont,   dateCont, payment, datePayment)
)

select cont,   dateCont, payment, datePayment
      ,sum(payment) over (partition by cont) as totalPayment

 from A;


Результат:
cont	dateCont	payment	datePayment	totalPayment
1 40140101 100.00 40140905 200.00
1 40140101 100.00 40140901 200.00
2 40140102 200.00 40140902 200.00
3 40140103 200.00 40140902 600.00
3 40140103 300.00 40140903 600.00
3 40140103 100.00 40140901 600.00
4 40140101 400.00 40140904 400.00

Это пример, не привязанный к Вашим конкретным данным!


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

Запрос возвращает результат на принтскрине:
--Запрос  с использованием оконных функций
   select [Нов.договор]
      ,[Страхователь]
      ,[Дата нов.дог.]
      ,[Дата платежа]
      ,[ЛБ нов]
      ,[ЛБ предыд]
      ,[СП по договору]
      ,sum([Платеж]) over (partition by [Нов.договор]) from  [test].[dbo].[Table_1];
go
--Запрос  select *
	  SELECT  [Нов.договор]
      ,[Клиент]
      ,[Дата нов.дог.]
      ,[Дата платежа]
      ,[ЛБ нов]
      ,[ЛБ предыд]
      ,[Платеж по договору]
      ,[Платеж]
  FROM [test].[dbo].[Table_1]


Строки все равно дублируются по количеству записей по проводках, хотя сумма платежей действительно подсчитывается правильно
Действительно можно как-то доработать этот запрос, или лучше использовать вложенный?

К сообщению приложен файл. Размер - 129Kb
12 сен 14, 19:52    [16570145]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить