powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет оборотов или нарастающий итог
5 сообщений из 5, страница 1 из 1
Расчет оборотов или нарастающий итог
    #32047313
Dl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dl
Гость
Есть таблица с ежедневными оборотами по каждому товару.
CREATE TABLE [dbo].[dmove] (
[kodt] [int,
[data] [smalldatetime] NULL ,
[kolvr] [float] NULL ,
[kolvr_t] [float] NULL ,
) ON [PRIMARY]
GO
Необходимо получить накопительные данные на каждый день по приходу расходу.Процедура расчета ниже.
Единственно что во всем этом смущает скорость.
Может кто подскажет кто как выходит из подобных ситуаций?

SET NOCOUNT ON
SET DATEFORMAT ymd
declare @t_kodt int
declare kodt_c cursor for
select вшыештсе kodt
from dmove
group by kodt
order by kodt

DECLARE
@iTemp int,
@iTemp2 int
open kodt_c

FETCH NEXT FROM kodt_c into @t_kodt
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @iTemp = 0
SELECT @iTemp2 = 0

update dmove set
kolvr_t = kolvr_t + @iTemp, @iTemp = @iTemp2,
@iTemp2 = @iTemp2 + kolvr
where kodt=@t_kodt
FETCH NEXT FROM kodt_c into @t_kodt
end
...
Рейтинг: 0 / 0
Расчет оборотов или нарастающий итог
    #32047322
Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может попробовать немного прооптимизировать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Здесь храняться даты сбросов счетчиков
       начало месяца
CREATE TABLE [dbo].[tblChopDates] (
	[IDX] [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	[ChopDate] [smalldatetime] NOT NULL 
) ON [PRIMARY]
GO

Здесь входящие остатки
CREATE TABLE [dbo].[tblIncomingCounts] (
	[ChopDate_IDX] [int] NOT NULL ,
	[IDX_Ware] [int] NOT NULL ,
	[W_Count] [decimal]( 8 ,  0 ) NOT NULL 
) ON [PRIMARY]
GO

Здесь движение
CREATE TABLE [dbo].[tblMonthlyItmesCounts] (
	[IDX_Ware] [int] NOT NULL ,
	[ChopDate_IDX] [int] NOT NULL ,
	[DateIncrease] [int] NOT NULL ,
	[W_Count] [decimal]( 9 ,  0 ) NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tblChopDates] WITH NOCHECK ADD 
	CONSTRAINT [PK_tblChopDates] PRIMARY KEY  CLUSTERED 
	(
		[IDX]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[tblIncomingCounts] WITH NOCHECK ADD 
	CONSTRAINT [PK_tblIncomingCounts] PRIMARY KEY  CLUSTERED 
	(
		[ChopDate_IDX],
		[IDX_Ware]
	)  ON [PRIMARY] 
GO

 CREATE  INDEX [IX_tblMonthlyItmesCounts] ON [dbo].[tblMonthlyItmesCounts]([IDX_Ware], [ChopDate_IDX], [DateIncrease]) ON [PRIMARY]
GO


Далее вот так заполнялось

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
TRUNCATE TABLE tblIncomingCounts
TRUNCATE TABLE tblMonthlyItmesCounts

Set Nocount ON
DECLARE @r int
DECLARE @M int
DECLARE @D int
DECLARE @C int

Set @r  =  0 
Set @M  =  0 
Set @D  =  0 
Set @C  =  0 


While @M <=  5 
begin
	While @r <  5000 
	begin
		INSERT INTO tblIncomingCounts
		                      (ChopDate_IDX, IDX_Ware, W_Count)
		VALUES     (@M, @R, RAND(DATEPART(ms, GETDATE())) *  20 )
		Set @R  = @R  +  1 
	end
	Set @R  =  0 
	Set @M  = @M  +  1 
end


While @D <=  30 
begin
	While @c <  50 
	begin
		INSERT INTO tblMonthlyItmesCounts
		                      (ChopDate_IDX, IDX_Ware, W_Count, DateIncrease)
		SELECT     ChopDate_IDX, IDX_Ware, RAND(DATEPART(ms, GETDATE())) *  20 , @D AS Expr1
		FROM         tblIncomingCounts
				
		Set @C  = @C  +  1 
	end
	Set @C  =  0 
	Set @D  = @D  +  1 
end

SET NOCOUNT OFF



по коду видно что в таблице движения находится около
37,000,000 записей за пять месяцев на 5000 наименований товара и 30 дней в месяце и 50 приёмов/передач на день

И выборка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
ALTER  PROCEDURE dbo.spvGetItemCount
	@ItemID int,
	@Date smalldatetime
AS
Set Nocount ON
DECLARE @dDate smalldatetime,
		@iDateIDX int,
		@iDateINC int,
		@decCount decimal( 9 , 2 )
SET @dDate = Convert(smalldatetime, '01.' + RIGHT('00' + cast(DatePart(mm,@Date) as varchar( 1 )), 2 ) + '.' + RIGHT('2000' + cast(DatePart(yy,@Date) as varchar( 4 )), 4 ),  104 )

Set @iDateIDX = (SELECT     TOP  1  IDX
FROM         tblChopDates
WHERE     (ChopDate = @dDate))

SET @iDateINC = DatePart(dd,@Date) -  1 

Set @decCount = (SELECT   TOP  1   W_Count
FROM         tblIncomingCounts
WHERE     (ChopDate_IDX = @iDateIDX) AND (IDX_Ware = @ItemID))

Select ICount + @decCount, IDX_Ware, ChopDate_IDX FROM
(SELECT     SUM(W_Count) AS ICount, IDX_Ware, ChopDate_IDX
FROM         tblMonthlyItmesCounts
WHERE     (DateIncrease <= @iDateINC) AND (ChopDate_IDX = @iDateIDX) AND (IDX_Ware = @ItemID)
GROUP BY IDX_Ware, ChopDate_IDX) dView

Set Nocount OFF


Максимальная продолжительность запроса ~2сек

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

С уважением.
Удачи.
...
Рейтинг: 0 / 0
Расчет оборотов или нарастающий итог
    #32047323
Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
строчку

Код: plaintext
1.
SET @dDate = Convert(smalldatetime, '01.' + RIGHT('00' + cast(DatePart(mm,@Date) as varchar( 1 )), 2 ) + '.' + RIGHT('2000' + cast(DatePart(yy,@Date) as varchar( 4 )), 4 ),  104 )


можно заменить на

Код: plaintext
1.
2.
3.
SELECT @bytenow = convert(binary( 8 ), @Date)

Cast(convert(int, substring(@bytenow,  1 ,  4 )) - (DatePart(dd,@Date)- 1 ) as smalldatetime)


явно будет красивее
...
Рейтинг: 0 / 0
Расчет оборотов или нарастающий итог
    #32047339
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dl
Поищите в форуме по словосочетаниям "нарастающий итог", "нарастающим итогом", ...
...
Рейтинг: 0 / 0
Расчет оборотов или нарастающий итог
    #32047561
Почемучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нет затруднений в винчестере (читать как Деньги), купите винт заведи еще одну БД и туда каждый день ночью скидывай итоги за день, тогда обсчет займет 0.(0)1 сек. на пополнение всей этой большой постоянно растущей таблицы.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет оборотов или нарастающий итог
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]