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

Откуда:
Сообщений: 17
Сломал уже весь мозг, задача вроде наипростейшая
Нужно найти процент в общей сумме.

К примеру у нас есть 3 партнера, каждый из них имеет по 30, 20, 10 договоров. Всего их 100.

соответсвенно нужно найти сколько процентов занимает каждый из этих партнеров. Вот запрос:

	           select foreignPartnerKey, count(1) as dogovors from 
			           (
						   select list.DL_PARTNERKEY as foreignPartnerKey
						   from tbl_DOGOVOR as dogovor
						   inner join tbl_DogovorList as list on list.DL_DGCOD = dogovor.DG_CODE
						   
							WHERE dogovor.DG_TURDATE between '2012-09-01' and '2012-09-30' 
								and dogovor.dg_cnkey = 5
								/*and DL_SVKEY = 3*/
			           ) as dogovor
			          
			           group by foreignPartnerKey


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

Гуглил, нашел решение с джоином http://www.cyberforum.ru/sql-server/thread96941.html но там есть дополнительное звено - группа, а здесь я в упор не могу понять как так их сцепить, что бы можно было это посчитать.
4 окт 12, 17:43    [13269728]     Ответить | Цитировать Сообщить модератору
 Re: Расчет от процента от общей суммы  [new]
Glory
Member

Откуда:
Сообщений: 104751
SET @x = (SELECT COUNT(DISTINCT DL_DGCOD ) FROM tbl_DogovorList)
SELECT foreignPartnerKey, COUNT(DISTINCT DL_DGCOD ),  @x
FROM tbl_DogovorList
GROUP BY foreignPartnerKey
4 окт 12, 18:01    [13269880]     Ответить | Цитировать Сообщить модератору
 Re: Расчет от процента от общей суммы  [new]
thekip
Member

Откуда:
Сообщений: 17
Вообщем посмотрел на принцип предидущего автора. Сделал свое решение... в котором так же как и в предыдущем примере сначала расчиталось в переменную общее количество, а затем с ним производились расчеты, но не понравиось дублирование кода (одни и те же условия 2 раза). Сделал выборку в переменную, а потом из неё остальные выборки, незнаю, может это и говнокод и для такой задачи есть более простое решение, но это вроде рабочее...

			        DECLARE @dogovors table(
			          foreignPartnerKey int NOT NULL
					);
					DECLARE @total int;
					
					INSERT INTO @dogovors
					(	
						foreignPartnerKey
					) 
					 select list.DL_PARTNERKEY as foreignPartnerKey
						   from tbl_DOGOVOR as dogovor
						   inner join tbl_DogovorList as list on list.DL_DGCOD = dogovor.DG_CODE
						   
							WHERE dogovor.DG_TURDATE between '2012-09-01' and '2012-09-30' 
								and dogovor.dg_cnkey = 5
								and DL_SVKEY = 3 
								 
						
						
						SET @total = ( select count(1) from @dogovors)
						
			           select foreignPartnerKey, (count(1)/@total) * 100 as [percent] from @dogovors as dogovor
			          
			           group by foreignPartnerKey
4 окт 12, 18:43    [13270115]     Ответить | Цитировать Сообщить модератору
 Re: Расчет от процента от общей суммы  [new]
Добрый Э - Эх
Guest
thekip
Т.е. я смог вывести таблицу в которой напротив ключа каждого партнера выводится количество его договоров. Но найти общую сумму этих договоров что бы потом разделить их никак не получается!


with
-- Тестовый набор данных
 t as (select 1 as id, 10 as cnt union all
           select 2 as id, 20 as cnt union all
           select 3 as id, 30 as cnt
          )
--
-- Основной зарос:
select t.*, cnt *1.0 / sum(cnt) over() *100.0 as pct
from t

ID	CNT	PCT
1	10	16.6666666666
2	20	33.3333333333
3	30	50
4 окт 12, 18:58    [13270167]     Ответить | Цитировать Сообщить модератору
 Re: Расчет от процента от общей суммы  [new]
thekip
Member

Откуда:
Сообщений: 17
А можно с расшифровкой что происходит в этом запросе?

Вообще впервый раз вижу такое использование union
5 окт 12, 10:04    [13271715]     Ответить | Цитировать Сообщить модератору
 Re: Расчет от процента от общей суммы  [new]
Добрый Э - Эх
Guest
thekip,

если вопрос ко мне, то кусок кода:
with
-- Тестовый набор данных
 t as (select 1 as id, 10 as cnt union all
           select 2 as id, 20 as cnt union all
           select 3 as id, 30 as cnt
          )
--
- банально формализованный на SQL твой исходный набор данных:
thekip
К примеру у нас есть 3 партнера, каждый из них имеет по 30, 20, 10 договоров


Что касается самого решения, то за него отвечает кусок кода:
--
-- Основной зарос:
select t.*, cnt *1.0 / sum(cnt) over() *100.0 as pct
from t

Выделенные в коде слова sum() over() - аналитические (оконные) функции. В данном случае - аналитическая сумма. В BOL-е о них вполне себе подробно расписано...
5 окт 12, 10:17    [13271816]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить