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

Откуда:
Сообщений: 8
Не знаю как правильно поставить вопрос... В общем, есть код и есть проблема, не могу понять как разрешить ее.
ссылка на бэкап базы
проблема в том что в итоговом столбце count получаются не те значения.

cout - повторные обращения
cout_all все обращения

т.е. если клиент обращался с начала года до текущего месяца, то в этом месяце у него должно быть cout = 1 (повторное обращение) и след. cout_all = 2

в строке
select id, cat, sum * count / (select sum(count) from #stage_3_2 b where b.id = a.id), sum(other)
считаю среднее значение

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

p.s.: в данный момент если выполнить этот код то получится сумма столбца sum = 44853,06 а должно быть 39877,44 - тоже не доезжаю где ошибка

знаю, много не описал, что еще нужно знать?

код:

create table #total(
	cat nvarchar(max) null,
	count smallint null,
	count_all smallint null,
	sum float null
)

	create table #stage_1_1(
		id smallint null,
		sum float null,
		date smalldatetime null
	)

		insert into #stage_1_1
		select liftclient.id, sum(liftdoc.price), liftdoc.data_close
			from liftdoc
			inner join liftclient on liftclient.id = liftdoc.id_cl
			where liftclient.id_cat = 1 and datepart(year, liftdoc.data_close) = 2012 and datepart(month, liftdoc.data_close) = 8 and (liftdoc.Del is null) and (liftdoc.Stat=2)
			group by liftclient.id, liftdoc.data_close
		
		create table #stage_1_2(
			id smallint null,
			sum float null,
			count smallint null
		)
			
			insert into #stage_1_2
			select id, sum(sum), count(date)
				from #stage_1_1
				group by id

			insert into #total
			select 'Малоимущие', count(id), sum(count), sum(sum)
				from #stage_1_2

		drop table #stage_1_2

	drop table #stage_1_1

	create table #stage_2_1(
		id smallint null,
		sum float null,
		date smalldatetime null
	)

		insert into #stage_2_1
		select liftclient.id, sum(liftdoc.price), liftdoc.data_close
			from liftdoc
			inner join liftclient on liftclient.id = liftdoc.id_cl
			where liftclient.id_cat = 2 and datepart(year, liftdoc.data_close) = 2012 and datepart(month, liftdoc.data_close) = 8 and (liftdoc.Del is null) and (liftdoc.Stat=2)
			group by liftclient.id, liftdoc.data_close

		create table #stage_2_2(
			id smallint null,
			sum float null,
			count smallint null
		)
		
			insert into #stage_2_2
			select id, sum(sum), count(date)
				from #stage_2_1
				group by id
				
			insert into #total
			select 'Многодетные', count(id), sum(count), sum(sum)
				from #stage_2_2
				
		drop table #stage_2_2

	drop table #stage_2_1 
	
	create table #stage_3_1(
		id smallint null,
		fam smallint null,
		cat smallint null,
		sum float null,
		date smalldatetime null
	)
	
		insert into #stage_3_1
		select liftclient.id, liftfmly.id, liftfmly.id_cat, sum(liftdoc.price), liftdoc.data_close
			from liftdoc
			inner join liftclient on liftclient.id = liftdoc.id_cl
			inner join liftfmly on liftfmly.id_cl = liftclient.id
			inner join liftcat on liftcat.id = liftfmly.id_cat
			where liftclient.id_cat = 0 and liftcat.lgot <> 0 and datepart(year, liftdoc.data_close) = 2012 and datepart(month, liftdoc.data_close) = 8 and (liftdoc.Del is null) and (liftdoc.Stat=2)
			group by liftclient.id, liftfmly.id, liftfmly.id_cat, liftdoc.data_close
		
		create table #stage_3_2(
			id smallint null,
			count smallint null,
			cat smallint null,
			sum float null,
			other smallint null
		)

			insert into #stage_3_2
			select id, count(fam), cat, sum(sum), count(date)
				from #stage_3_1
				group by id, cat
				order by id
			
			create table #stage_3_3(
				id smallint null,
				cat smallint null,
				sum float null,
				count smallint null
			)
			
				insert into #stage_3_3
				select id, cat, sum * count / (select sum(count) from #stage_3_2 b where b.id = a.id), sum(other)
					from #stage_3_2 a
					group by id, cat, sum, count
				
				insert into #total
				select liftcat.name, count(a.id), sum(count), sum(sum)
					from #stage_3_3 a
					inner join liftcat on liftcat.id = cat
					group by liftcat.name
			
			drop table #stage_3_3
		
		drop table #stage_3_2

	drop table #stage_3_1

select * from #total

drop table #total
2 авг 12, 21:52    [12955354]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
Читатель неместный
Guest
obozhin
.........
cout - повторные обращения
cout_all все обращения

т.е. если клиент обращался с начала года до текущего месяца, то в этом месяце у него должно быть cout = 1 (повторное обращение) и след. cout_all = 2
..............
знаю, много не описал, что еще нужно знать?
.........

а если он обращался уже несколько раз до текущего месяца?

Нужны структуры недостающих таблиц (описания значимых полей) и скрипты заполнения тестовыми значениями
(бекап вот некоторые не умеют поднимать)
И какой результат должен получиться по этим данным
2 авг 12, 22:27    [12955442]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
obozhin
Member

Откуда:
Сообщений: 8
Читатель неместный
а если он обращался уже несколько раз до текущего месяца?


получается если клиент А пришел в 1, 2, 3 месяцах то count = 1, а count_all = 3


Читатель неместный
Нужны структуры недостающих таблиц (описания значимых полей) и скрипты заполнения тестовыми значениями
(бекап вот некоторые не умеют поднимать)


сейчас попробую описать подробнее


Читатель неместный
И какой результат должен получиться по этим данным


на самом деле ни кто не знает )) в этом то и проблема. есть только общая sum (сумма). ну чисто мое предположение - это если count и cunt_all будут правильно считаться и общая сумма будет совпадать, то я бы сильно согласился с этим.
2 авг 12, 22:49    [12955489]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
Читатель неместный
Guest
obozhin
на самом деле ни кто не знает )) в этом то и проблема. есть только общая sum (сумма). ну чисто мое предположение - это если count и cunt_all будут правильно считаться и общая сумма будет совпадать, то я бы сильно согласился с этим.

Ну по тем тестовым данным, ято вы перешлете, вы же можете вручную посчитать что да как должно получиться
2 авг 12, 23:08    [12955537]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
obozhin
Member

Откуда:
Сообщений: 8
liftdoc.price - сколько нужно заплатить
liftdoc.data_close - дата закрытия периода (с 2012г - документы за этот месяц, то закрывают период 1м числом следующего месяца)
liftdoc.id_cl - соответственно id клиента
liftclient.id_cat - id категории
liftdoc.Del - на удалении или нет(если стоит значение <is null> то все в порядке, интересует только значение is null)
liftdoc.Stat - если = 2 значит период у документа закрыт и редактировать его нельзя(интересует только stat = 2)
liftfmly.id_cat - id категории
3 авг 12, 08:23    [12956091]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
Читатель неместный
Guest
А теперь надо ждать...когда придут дядьки, которые умеют бекап поднимать, и ответят вам
3 авг 12, 20:58    [12960828]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
nezhadnye_my
Guest
бардак какой-то несусветный.
1. в базе нет ни одного ключа(молчу про внешние, нет ни одного ПК), какие после этого рассуждения на тему повторов?
2. поля типа float для price, чем не устраивает money? -> суммы уже кривые.
3. приведенный скрипт дает сумму 38244,41, а не 44853,06 (1-ое окно на картинке) -> показания не сходятся.
4. беру пример только малоимущих. вот что лежит в базе за 2012 г (2-ая картинка)
какой ответ должен быть для малоимущих(count, coun_all, sum)?

К сообщению приложен файл. Размер - 51Kb
5 авг 12, 00:09    [12963432]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
obozhin
Member

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

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

п.с.: да, как на второй картинке должно быть
6 авг 12, 06:35    [12965918]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
obozhin
Member

Откуда:
Сообщений: 8
мне больше всего не понятно, как разбить людей в таблице liftfmly. там id_cl одинаковые у членов одной семьи, но категории то могут быть разные. вот допустим id_cl = 1 там два человека с категориями 7 и 8... мозг лопается... по идее раз деньги на семью то можно посчитать среднее значение и раскидать по категориям, но это же пипец какая чушь!!!
6 авг 12, 07:01    [12965936]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
obozhin
Member

Откуда:
Сообщений: 8
автор
А теперь надо ждать...когда придут дядьки, которые умеют бекап поднимать, и ответят вам


в чем проблема бэкап поднять?
6 авг 12, 07:03    [12965938]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
Читатель неместный
Guest
obozhin
в чем проблема бэкап поднять?

Получилось так что я не админ.
И правов нет соответственно.
И ставить сиклсервер на домашний комп нет желания никакого
6 авг 12, 08:19    [12966025]     Ответить | Цитировать Сообщить модератору
 Re: поиск повторов  [new]
obozhin
Member

Откуда:
Сообщений: 8
Читатель неместный,

я так понимаю надо просто выложить mdf и ldf?
вот они: db
6 авг 12, 09:07    [12966093]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить