powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли сделать без курсоров?
19 сообщений из 19, страница 1 из 1
Можно ли сделать без курсоров?
    #32648822
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем здравствуйте...

Задача меня уже доконала...
Может кто делал что-нить аналогичное?

Есть список товарных остатков в виде:

Код: plaintext
1.
2.
3.
4.
5.
WareCode Contr    Col1       Col3       DateIn               PriceRel
1	  1	40	0	2004-08-12        0
1	  2	10	0	2004-08-10        0
1	  3	5	0	2004-08-11        0
2	  3	5	0	2004-08-12        0

Есть список расходов в виде

Код: plaintext
1.
2.
3.
WareCode  Amount  Price
1	  10          50
1	  80          200

Задача:
Вычесть из остатков расходы (вычтенное количество писать в Col3 таблицы
остатков)
Причем:
1) вычитать надо сначала из тех строк, у которых дата прихода раньше.
2) необходимо накапливать в PriceRel первой таблицы (остатков) сумму
вычтенных из нее расходов (Price*Amount) второй таблицы...
3) если остатков не хватает для вычета, нужно создать новую строчку в таблице остатков, и в PriceRel тоже хранить сумму вычетов (Price*Amount)

Итог: в данном случае должно получиться что-то типа...
Код: plaintext
1.
2.
3.
4.
5.
6.
WareCode Contr    Col1       Col3       DateIn               PriceRel  [очередность]
1	  1	40	40	2004-08-12        40*200           3
1	  2	10	10	2004-08-10        10*50            1
1	  3	5	5	2004-08-11        5*200            2
2	  3	5	0	2004-08-12        0                   -
1           0        0       35         -            35*200           4   

У меня без курсоров никак... Но на реальных данных (100 000) торомозит.

Если кто нибудь подскажет, как сделать БЕЗ КУРСОРОВ, будет просто здорово.
Если нет, значит нет...

Спасибо.

P.S.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table #tmp (WareCode int,Contr int, Col1 int, Col3 int, DateIn datetime, PriceRel money)
insert into #tmp values ( 1 , 1 , 40 , 0 , '2004-08-12', 0 )
insert into #tmp values ( 1 , 2 , 10 , 0 , '2004-08-10', 0 )
insert into #tmp values ( 1 , 3 , 5 , 0 , '2004-08-11', 0 )
insert into #tmp values ( 2 , 3 , 5 , 0 , '2004-08-12', 0 )

create table #tmp2(WareCode int,Amount int, Price money)
insert into #tmp2 values ( 1 , 10 ,  50 )
insert into #tmp2 values ( 1 , 50 ,  200 )

select * from #tmp
select * from #tmp2

drop table #tmp
drop table #tmp2
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648833
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц

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

Беглый взгляд по ссылке...

автор
для простоты считаем, что код товара в накладной втречается единожды - т е нет отгрузки одного и того же товара по разным ценам (или уже усреднили, к примеру)

задача - построить расходную накладную, отгружая сначала ранние партии
без курсоров получилось вот что


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

Да еще и строчки когда надо добавлять...
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648856
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Алексей2003: В продолжение темы, вопрос такой ,а почему все временные таблы называют курсорами. По-моему курсор это
Код: plaintext
1.
2.
3.
Declare abc Cursor
open abc
for SELECT ....
или я ошибаюсь, мож поясните?
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648867
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proga2 Алексей2003: В продолжение темы, вопрос такой ,а почему все временные таблы называют курсорами. По-моему курсор это
Код: plaintext
1.
2.
3.
Declare abc Cursor
open abc
for SELECT ....
или я ошибаюсь, мож поясните?
Кто называет? Временные таблы - это временные таблы, табличные переменные - это табличные переменные, курсоры - это, как ни странно, курсоры.
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648877
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда где здесь курсор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table #tmp (WareCode int,Contr int, Col1 int, Col3 int, DateIn datetime, PriceRel money)
insert into #tmp values ( 1 , 1 , 40 , 0 , '2004-08-12', 0 )
insert into #tmp values ( 1 , 2 , 10 , 0 , '2004-08-10', 0 )
insert into #tmp values ( 1 , 3 , 5 , 0 , '2004-08-11', 0 )
insert into #tmp values ( 2 , 3 , 5 , 0 , '2004-08-12', 0 )

create table #tmp2(WareCode int,Amount int, Price money)
insert into #tmp2 values ( 1 , 10 ,  50 )
insert into #tmp2 values ( 1 , 50 ,  200 )

select * from #tmp
select * from #tmp2

drop table #tmp
drop table #tmp2
или я так думаю, автор топика вопросы задавать не умеет..... или я их понимать
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648885
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нету там курсора.
прочитал человек правила и задал вопрос


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648889
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Proga: господин Andy154 как раз хочет БЕЗ курсоров и любезно подготовил временную таблицу с тестовыми данными. всм бы по-учится ещё вопросы задаватьу него ИМХО.
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648895
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Proga
Курсоры используются в решении проблемы...

Свое решение я публиковать не стал, во-первых потому, что
оно использует курсоры, а во-вторых для того, чтобы задать вопрос, я существенно упростил задачу и структуры таблиц...

В моем посте:
1) Описание входных данных
2) Описание выходных данных

решение пропущено :-).

Собственно поэтому я и задаю вопрос "Как лучше сделать?" уважаемому форму...

P.S.
Не нужно устраивать цирк.
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648901
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Andy154
вечером буит решение, если найду и меня нихто не опредит :)


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32648965
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Алексей2003
Да хоть в понедельник, лишь бы было :-)!!!

2Luchkin Dmitry
Спасибо!
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32649108
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам 2 решения аналогичной задачи с поставками и оплатами
Код: 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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
set nocount on
if object_id('tempdb..#Supplies') is not null drop table #Supplies
create table #Supplies (supply_id int identity, supply_dat smalldatetime, supply_amount smallmoney)
insert #Supplies (supply_dat, supply_amount) values ('2002-09-01',  1000 ) 
insert #Supplies (supply_dat, supply_amount) values ('2002-09-03',  800 )
insert #Supplies (supply_dat, supply_amount) values ('2002-09-05',  1400 )

if object_id('tempdb..#Payments') is not null drop table #Payments
create table #Payments (pay_id int identity, pay_dat smalldatetime, pay_amount smallmoney)
 --insert #Payments (pay_dat, pay_amount) values ('2002-08-05', 1000) 
 --insert #Payments (pay_dat, pay_amount) values ('2002-08-05', 300) 
insert #Payments (pay_dat, pay_amount) values ('2002-09-01',  600 ) 
 --insert #Payments (pay_dat, pay_amount) values ('2002-09-02', 900) 
insert #Payments (pay_dat, pay_amount) values ('2002-09-02',  1700 )
insert #Payments (pay_dat, pay_amount) values ('2002-09-04',  1300 )
 --insert #Payments (pay_dat, amount) values ('2002-09-05', 100) 


if object_id('tempdb..#t1') is not null drop table #t1
select a.supply_id, a.sum1, (a.tot_sum1 - a.sum1) as tot_sum1, b.supply_dat into #t1 
from
(select a.supply_id, max(a.supply_amount) as sum1, sum(isnull(b.supply_amount,  0 . 00 )) +  max(a.supply_amount) as tot_sum1
	from #supplies a 
	left outer join #supplies b on b.supply_id < a.supply_id
	group by a.supply_id
) as a
inner join #supplies b on b.supply_id = a.supply_id

if object_id('tempdb..#t2') is not null drop table #t2
select a.pay_id, a.sum2, (a.tot_sum2 - a.sum2) as tot_sum2, b.pay_dat into #t2 from
(select a.pay_id, max(a.pay_amount) as sum2, sum(isnull(b.pay_amount,  0 . 00 ))+max(a.pay_amount) as tot_sum2
	from #payments a 
	left outer join #payments b on b.pay_id < a.pay_id
group by a.pay_id
) as a
inner join #payments b on b.pay_id = a.pay_id


select * from
(select a.supply_id as id_1, a.sum1, a.tot_sum1, b.pay_id as id_2, b.sum2, b.tot_sum2, 
case	when a.tot_sum1 > b.tot_sum2
	then	case	when (b.sum2 - (a.tot_sum1 - b.tot_sum2)) > a.sum1
			then a.sum1
			when (b.sum2 - (a.tot_sum1 - b.tot_sum2)) <= a.sum1
			then b.sum2 - (a.tot_sum1 - b.tot_sum2)
		end

	when a.tot_sum1 < b.tot_sum2
	then	case	when ((b.tot_sum2 + b.sum2) - a.tot_sum1) >= a.sum1
			then (a.sum1 - (b.tot_sum2 - a.tot_sum1))
			when ((b.tot_sum2 + b.sum2) - a.tot_sum1) < a.sum1
			then b.sum2

		end

	else	case	when a.sum1 > b.sum2
			then b.sum2
			when a.sum1 <= b.sum2
			then a.sum1
		end
end x
from #t1 a 
cross join #t2 b
) as a
where x >  0 
order by a.id_1, a.id_2



select supply_id, pay_id,
  case when f11 < f21 then f11 else f21 end -
  case when f11-f1 < f21-f2 then f21-f2 else f11-f1 end as SALE_BOOK_VALUE
 from (select a.supply_id, b.pay_id,
   a.supply_amount as f1, b.pay_amount as f2,
   (select sum(a1.supply_amount)
     from #Supplies a1
     where convert(char( 20 ), a1.supply_dat,  120 ) + convert(char( 16 ), a1.supply_id)
      <= convert(char( 20 ), a.supply_dat,  120 ) + convert(char( 16 ), a.supply_id)) as f11,
   (select sum(b1.pay_amount)
     from #payments b1
     where convert(char( 20 ), b1.pay_dat,  120 ) + convert(char( 16 ), b1.pay_id)
      <= convert(char( 20 ), b.pay_dat,  120 ) + convert(char( 16 ), b.pay_id)) as f21
  from #Supplies a, #payments b) t
 where case when f11 < f21 then f11 else f21 end -
 case when f11-f1 < f21-f2 then f21-f2 else f11-f1 end >  0 
 order by supply_id, pay_id
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32649139
Дмитрий Валуев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory
Вот только этого
автор3) если остатков не хватает для вычета, нужно создать новую строчку в таблице остатков, и в PriceRel тоже хранить сумму вычетов (Price*Amount)
в предлагаемых решениях скорее всего нет. Относительно последнего почти уверен, когда-то разбирал, но давно.
Но за основу принять можно
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32649268
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory
Спасибо!
Попробую разобраться...
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32649352
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Дмитрий Валуев
Да, действительно, строчки не добавляет :-).

Но за основу принял...

Пока топик не закрываю... Может быть, будут еще варианты?
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32649594
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это без циклов, курсоров и т.п. (база MS-SQL приложена)

Несколько изменены таблицы:

Расходы. Добавлено [DateIn] - иначе невозможно установить порядок исчисления расходов. [ID] - это добавлено по привычке (не используется)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE [dbo].[Costs] (
	[WareCode] [int] NOT NULL ,
	[Amount] [int] NOT NULL ,
	[Price] [money] NOT NULL ,
	[DateIn] [datetime] NOT NULL ,
	[ID] [int] IDENTITY ( 1 ,  1 ) NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Costs] ADD 
	CONSTRAINT [PK_Costs] PRIMARY KEY  CLUSTERED 
	(
		[ID]
	)  ON [PRIMARY] ,
	CONSTRAINT [IX_Costs] UNIQUE  NONCLUSTERED 
	(
		[WareCode],
		[Amount],
		[Price],
		[DateIn]
	)  ON [PRIMARY] 
GO

Запасы. Добавлено [ID] - это добавлено для идентификации строк.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE [dbo].[Leavings] (
	[WareCode] [int] NOT NULL ,
	[Contr] [int] NULL ,
	[Col1] [int] NOT NULL ,
	[Col3] [int] NULL ,
	[DateIn] [datetime] NULL ,
	[PriceRel] [money] NULL ,
	[ID] [int] IDENTITY ( 1 ,  1 ) NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Leavings] ADD 
	CONSTRAINT [PK_Leavings] PRIMARY KEY  CLUSTERED 
	(
		[ID]
	)  ON [PRIMARY] ,
	CONSTRAINT [IX_Leavings] UNIQUE  NONCLUSTERED 
	(
		[WareCode],
		[DateIn]
	)  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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
 -- запасы нарастающим итогом по DateIn 
CREATE VIEW dbo.Leavings_Cumulative
AS
SELECT     ID, WareCode, Contr, Col1, Col3, DateIn, PriceRel, ISNULL
                          ((SELECT     SUM(Col1)
                              FROM         Leavings X
                              WHERE     X.WareCode = T.WareCode AND X.DateIn < T.DateIn AND X.Col1 >  0 ),  0 ) AS Col1_prev
FROM         dbo.Leavings T
WHERE     (Col1 >  0 )
GO

 -- сгруппированные по WareCode расходы 
CREATE VIEW Costs_Grouped
AS
SELECT WareCode, SUM(Amount) Amount   
FROM Costs C 
GROUP BY WareCode
GO

 -- удовлетворенные расходы с разбивкой по строкам таблицы запасов 
CREATE VIEW dbo.Costs_Contented
AS
SELECT     C.WareCode, L.ID, L.DateIn, CASE WHEN L.Col1_prev + L.Col1 < C.Amount THEN L.Col1 ELSE (C.Amount - L.Col1_prev) 
                      END AS Amount_Contented
FROM         dbo.Costs_Grouped C INNER JOIN
                      dbo.Leavings_Cumulative L ON C.WareCode = L.WareCode AND L.Col1_prev < C.Amount
GO

 --   расходы в порядке DateIn нарастающим итогом 
CREATE VIEW dbo.Costs_Cumulative
AS
SELECT     WareCode, Amount, Price, DateIn, ISNULL
                          ((SELECT     SUM(Amount)
                              FROM         Costs X
                              WHERE     X.WareCode = T.WareCode AND X.DateIn < T.DateIn),  0 ) AS Amount_prev
FROM         dbo.Costs T
GO

 --   удовлетворенные расходы нарастающим  в порядке DateIn нарастающим итогом 
CREATE VIEW dbo.Costs_Contented_Cumulative
AS
SELECT     ID, WareCode, DateIn, Amount_Contented, ISNULL
                          ((SELECT     SUM(Amount_Contented)
                              FROM         Costs_Contented X
                              WHERE     X.WareCode = T.WareCode AND X.DateIn < T.DateIn),  0 ) AS Amount_Contented_prev
FROM         dbo.Costs_Contented T
GO

 --   удовлетворенные расходы связаны со строками таблицы запасов, за счет которых проведены 
CREATE VIEW dbo.Costs_Contented_Detailed
AS
SELECT     CC.WareCode, CC.Amount, CC.Price, CC.DateIn AS cDateIn, CC.Amount_prev, CCC.ID, CCC.DateIn AS lDateIn, CCC.Amount_Contented, 
                      CCC.Amount_Contented_prev
FROM         dbo.Costs_Cumulative CC LEFT OUTER JOIN
                      dbo.Costs_Contented_Cumulative CCC ON CC.WareCode = CCC.WareCode AND (CCC.Amount_Contented_prev >= CC.Amount_prev AND 
                      CCC.Amount_Contented_prev < CC.Amount_prev + CC.Amount OR
                      CCC.Amount_Contented_prev + CCC.Amount_Contented > CC.Amount_prev AND 
                      CCC.Amount_Contented_prev + CCC.Amount_Contented < CC.Amount_prev + CC.Amount)
GO

 --   удовлетворенные расходы Amount_Contented_Here + связаны со строками таблицы запасов, за счет которых проведены 
CREATE VIEW dbo.Costs_Leaving_Contented_Detailed
AS
SELECT     WareCode, Amount, Price, cDateIn, ID, lDateIn, (CASE WHEN (Amount_Contented_prev >= Amount_prev) AND 
                      (Amount_Contented_prev + Amount_Contented <= Amount_prev + Amount) THEN Amount_Contented WHEN (Amount_Contented_prev < Amount_prev) 
                      AND (Amount_Contented_prev + Amount_Contented <= Amount_prev + Amount) THEN Amount_Contented - (Amount_prev - Amount_Contented_prev) 
                      WHEN (Amount_Contented_prev < Amount_prev) AND (Amount_Contented_prev + Amount_Contented > Amount_prev + Amount) 
                      THEN Amount ELSE (- Amount_Contented_prev + Amount_prev - Amount) END) Amount_Contented_Here
FROM         dbo.Costs_Contented_Detailed
WHERE     ID IS NOT NULL
GO

 --   группированные удовлетворенные расходы 
CREATE VIEW dbo.Costs_Contented_Grouped
AS
SELECT     WareCode, Amount, Price, cDateIn, SUM(Amount_Contented_Here) AS Amount_Contented_Here
FROM         dbo.Costs_Leaving_Contented_Detailed C
GROUP BY WareCode, Amount, Price, cDateIn
GO

-----------------------------
Основные виды


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 --   Обновление для таблицы Leavings.  UPDATE написать могет каждый 
CREATE VIEW dbo.Leavings_Update
AS
SELECT     C.ID, L.WareCode, L.Contr, L.Col1, SUM(C.Amount_Contented_Here) AS Col3, L.DateIn, SUM(C.Amount_Contented_Here * C.Price) AS PriceRel
FROM         dbo.Costs_Leaving_Contented_Detailed C INNER JOIN
                      dbo.Leavings L ON C.ID = L.ID
GROUP BY C.ID, L.WareCode, L.Contr, L.Col1, L.DateIn

GO
 --   Добавление для таблицы Leavings. ADD написать могет каждый 
CREATE VIEW dbo.Leavings_Add
AS
SELECT     C.WareCode, NULL AS Contr,  0  AS Col1, C.Amount - ISNULL(CC.Amount_Contented_Here,  0 ) AS Col2, NULL AS DateIn, 
                      (C.Amount - ISNULL(CC.Amount_Contented_Here,  0 )) * CC.Price AS PriceRel
FROM         dbo.Costs_Contented_Grouped CC RIGHT OUTER JOIN
                      dbo.Costs C ON CC.WareCode = C.WareCode AND CC.Amount = C.Amount AND CC.Price = C.Price AND CC.cDateIn = C.DateIn
WHERE     (CC.Amount_Contented_Here < C.Amount) OR
                      (CC.Amount_Contented_Here IS NULL)
GO
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32650236
Алексей2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно так :)
Код: 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.
 --create table #ttt (datein datetime, idg int, contr int, col1hipout int) 

insert into #ttt (datein, idg, contr, col1hipout)
SELECT     T1.DateIn, T1.WareCode AS idg, min(t1.contr),

CASE
	WHEN  Sum([T2].[col1])-t3.Amount<= 0  THEN [T1].[col1]
	ELSE [T1].[col1]- (Sum([T2].[col1])-t3.Amount)
END AS Col1hipout

FROM 
   (select WareCode, Contr, Col1, DateIn
     from dbo.#tmp
    union all
    select warecode,  0  Contr,  10000  Col1, '20700101' DateIn
     from dbo.#tmp
     group by warecode
   )  T1
  INNER JOIN
   (select WareCode, Contr, Col1, DateIn
     from dbo.#tmp
    union all
    select warecode,  0  Contr,  10000  Col1, '20700101' DateIn
     from dbo.#tmp
     group by warecode
   ) T2 ON T1.DateIn >= T2.DateIn AND T2.WareCode = T1.WareCode
  INNER JOIN (select warecode, sum(amount) amount from dbo.#tmp2 group by warecode) t3 ON T1.WareCode = t3.WareCode
GROUP BY T1.DateIn, T1.col1, T1.WareCode, t3.Amount
HAVING      (SUM(T2.col1) - t3.Amount < T1.col1)

update tmp set col3 = col1hipout
 from #tmp tmp join #ttt ttt on ttt.idg = tmp.warecode and ttt.contr = tmp.contr

insert into #tmp (warecode, contr, col1, col3, datein, pricerel)
 select idg, contr, col1hipout, col1hipout, datein,  0  from #ttt where contr =  0 

select * from #tmp
select * from #ttt

delete from #ttt

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


для спящего время бодрствования равносильно сну
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32650446
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2aleks2
Спасибо! Разбираюсь...

2Алексей2003
Здорово!

А чем могут помочь доп. столбцы?
Необязательно код писать, подкиньте идейку...

Код Glory для меня крутоват оказался :-(. Без комментариев никак...
...
Рейтинг: 0 / 0
Можно ли сделать без курсоров?
    #32829837
Andy154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory
В тот раз обошелся, но встала новая проблема...

Все-таки разобрался с Вашим примером :-)

В нем есть один момент, который на мою ситуацию распространить нельзя.
В Вашем примере возможно провести оплату ДО отгрузки, а мне расход ДО прихода никак нельзя :-(.

Пытался модифицировать но не вышло...

Нет ли еще каких нибудь способов?

P.S. Поиском по "Фифо" пользовался. Прочитал все. Единого мнения не нашел...
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли сделать без курсоров?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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