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

Откуда:
Сообщений: 2
Добрый вечер, Уважаемые гуру SQL!

товарооборот. учет остатков и подсчет себестоимости.

есть комплектующие (приход), на основе комплектующих (по таблице соответствия, одни и те же комплектующие могут быть в разных готовых изделиях) собираются готовые изделия, которые затем продаются (уход).

создал следующую структуру:
1/ таблица документов (приход, уход)
2/ в момент когда появляется "приход" записываю данные не только в таблицу "документов", но и в дополнительную таблицу "остатки"
3/ когда происходит сборка готового изделия
а/ переношу записи (комплектующие) из таблицы "остатки" в промежуточную таблицу "движение комплектующих", для того, чтобы всегда иметь связь с входящими документами
б/ вношу записи (готовые изделия) в таблицу "остатки" (не просто общее количество, а с учетом себестоимости)
4/ в момент "ухода" готовой продукции записи из "остатков" перемещаются в "движение готовых"

споткнулся на пункте "3 б", который выдавал бы список себестоимости готового изделия на основе разной цены комплектующих, т.е. для того, чтобы внести в "остатки" готовые изделия с разной себестоимостью.

есть таблица соответствия, в которой хранится из каких комплектующих состоит готовое изделие
if OBJECT_ID('tempdb..#ProductRelation','U') IS NOT NULL DROP TABLE #ProductRelation
CREATE TABLE #ProductRelation(
id int IDENTITY(1,1) NOT NULL,
classifier_product_guid uniqueidentifier NOT NULL,
classifier_unit_guid uniqueidentifier not null,
unit_count int not null,
start_timestamp datetime,
end_timestamp datetime
)

INSERT INTO #ProductRelation 
VALUES 
--1-ое (А) готовое изделие
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', '84709A5C-8C98-4EFF-9347-58060D7B18FA', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'E54E7451-1A8F-48BB-AF59-11970E073796', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'A15A663C-8353-444A-9F93-557DC8E59FB9', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'C3A2DA53-6B7B-4D77-87CF-A924E12A7D58', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D8B22734-7D08-4EFA-A823-2080D42619CF', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
--2-ое (Б) готовое изделие
('BDC02AE9-DE94-404C-AAC4-023991323515', '84709A5C-8C98-4EFF-9347-58060D7B18FA', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('BDC02AE9-DE94-404C-AAC4-023991323515', 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('BDC02AE9-DE94-404C-AAC4-023991323515', 'E54E7451-1A8F-48BB-AF59-11970E073796', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000');


собрали 15 штук "А" и 5 штук "Б":

данные о использованных комплектующих есть в промежуточной таблице "дижение комплектующих":
if OBJECT_ID('tempdb..#UnitMovement','U') IS NOT NULL DROP TABLE #UnitMovement;
CREATE TABLE #UnitMovement(
id int IDENTITY(1,1) NOT NULL,
classifier_unit_guid uniqueidentifier not null,
unit_count int not null ,
price decimal(15,5) not null,
document_date datetime not null  --дата прихода
);

INSERT INTO #UnitMovement
VALUES
('E54E7451-1A8F-48BB-AF59-11970E073796', 2, 9.00000, '2012-02-01 00:00:00.000'),
('E54E7451-1A8F-48BB-AF59-11970E073796', 18, 7.00000, '2012-02-02 00:00:00.000'),
('D8B22734-7D08-4EFA-A823-2080D42619CF', 15, 6.00000, '2012-02-08 00:00:00.000'),
('A15A663C-8353-444A-9F93-557DC8E59FB9', 15, 8.00000, '2012-02-08 00:00:00.000'),
('84709A5C-8C98-4EFF-9347-58060D7B18FA', 20, 1.00000, '2012-02-08 00:00:00.000'),
('C3A2DA53-6B7B-4D77-87CF-A924E12A7D58', 15, 5.00000, '2012-02-08 00:00:00.000'),
('D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 4, 3.00000, '2012-02-02 00:00:00.000'),
('D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 11, 4.00000, '2012-02-08 00:00:00.000'),
('D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 20, 2.00000, '2012-02-08 00:00:00.000');


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

название готового изделияколичествосебестоимость
А (7C09833D-7B66-4A98-86CB-0457AD5CEBD7)234
А (7C09833D-7B66-4A98-86CB-0457AD5CEBD7)232
А (7C09833D-7B66-4A98-86CB-0457AD5CEBD7)1133
Б (BDC02AE9-DE94-404C-AAC4-023991323515)510


подозреваю, что такое нагромождение появилось из-за изначально неправильной архитектуры, но я не вижу других решений, как сделать так, чтобы
1/ по исходящему документу (уход) видеть какие входящие (приход) документы использовались
2/ в случае изменений задним числом в любом месте (приход, сборка, уход) не оказывалось влияния на последующие документы

прошу заранее простить за сыр-бор.

Microsoft SQL Server 2005 - 9.00.5000.00 (X64) Dec 10 2010 10:38:40 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 (Build 6002: Service Pack 2)

спасибо!
13 фев 12, 00:22    [12079059]     Ответить | Цитировать Сообщить модератору
 Re: подсчет себестоимости готового изделия  [new]
Viktors
Member

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

if OBJECT_ID('tempdb..#ProductRelation','U') IS NOT NULL DROP TABLE #ProductRelation
CREATE TABLE #ProductRelation(
id int IDENTITY(1,1) NOT NULL,
classifier_product_guid uniqueidentifier NOT NULL,
classifier_unit_guid uniqueidentifier not null,
unit_count int not null,
start_timestamp datetime,
end_timestamp datetime
)

INSERT INTO #ProductRelation 
VALUES 
--1-ое (А) готовое изделие
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', '84709A5C-8C98-4EFF-9347-58060D7B18FA', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'E54E7451-1A8F-48BB-AF59-11970E073796', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'A15A663C-8353-444A-9F93-557DC8E59FB9', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'C3A2DA53-6B7B-4D77-87CF-A924E12A7D58', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D8B22734-7D08-4EFA-A823-2080D42619CF', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
--2-ое (Б) готовое изделие
('BDC02AE9-DE94-404C-AAC4-023991323515', '84709A5C-8C98-4EFF-9347-58060D7B18FA', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('BDC02AE9-DE94-404C-AAC4-023991323515', 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'),
('BDC02AE9-DE94-404C-AAC4-023991323515', 'E54E7451-1A8F-48BB-AF59-11970E073796', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000');

if OBJECT_ID('tempdb..#UnitMovement','U') IS NOT NULL DROP TABLE #UnitMovement;
CREATE TABLE #UnitMovement(
id int IDENTITY(1,1) NOT NULL,
classifier_unit_guid uniqueidentifier not null,
unit_count int not null ,
price decimal(15,5) not null,
document_date datetime not null,  --дата прихода
used_count int null,
temp_guid uniqueidentifier null
);

INSERT INTO #UnitMovement (classifier_unit_guid, unit_count, price, document_date)
VALUES
('E54E7451-1A8F-48BB-AF59-11970E073796', 2, 9.00000, '2012-02-01 00:00:00.000'),
('E54E7451-1A8F-48BB-AF59-11970E073796', 18, 7.00000, '2012-02-02 00:00:00.000'),
('D8B22734-7D08-4EFA-A823-2080D42619CF', 15, 6.00000, '2012-02-08 00:00:00.000'),
('A15A663C-8353-444A-9F93-557DC8E59FB9', 15, 8.00000, '2012-02-08 00:00:00.000'),
('84709A5C-8C98-4EFF-9347-58060D7B18FA', 20, 1.00000, '2012-02-08 00:00:00.000'),
('C3A2DA53-6B7B-4D77-87CF-A924E12A7D58', 15, 5.00000, '2012-02-08 00:00:00.000'),
('D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 4, 3.00000, '2012-02-02 00:00:00.000'),
('D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 11, 4.00000, '2012-02-08 00:00:00.000'),
('D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 20, 2.00000, '2012-02-08 00:00:00.000');

if OBJECT_ID('tempdb..#Product','U') IS NOT NULL DROP TABLE #Product;
CREATE TABLE #Product(
id int IDENTITY(1,1) NOT NULL,
classifier_product_guid uniqueidentifier not null,
count int not null ,
price decimal(15,5) not null
);


DECLARE @classifier_product_guid uniqueidentifier;
DECLARE @product_count int;
DECLARE @classifier_unit_guid uniqueidentifier;
DECLARE @temp_guid uniqueidentifier;

DECLARE @minCount int;
DECLARE @unit_count int;
DECLARE @used_count int;
DECLARE @price decimal(15,5);
DECLARE @date datetime;

select @temp_guid = newid();
SET @date = GETDATE();

--бегаем по списку готовых изделий
DECLARE db_cursor CURSOR FOR  
select classifier_product_guid, count from (select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7' as classifier_product_guid, 15 as count union select 'BDC02AE9-DE94-404C-AAC4-023991323515' as classifier_product_guid, 5 as count) t
OPEN db_cursor   
	FETCH NEXT FROM db_cursor INTO @classifier_product_guid, @product_count

	WHILE @@FETCH_STATUS = 0   
	BEGIN  
		
		WHILE @product_count > 0
		BEGIN
			--получаем
			select 
				@minCount = MIN(um.unit_count) 
			from 
				#ProductRelation pr 
				join #UnitMovement um on pr.classifier_unit_guid = um.classifier_unit_guid
			where 
				pr.classifier_product_guid = @classifier_product_guid 
				and 
				um.id in (select top 1 id from #UnitMovement where classifier_unit_guid = um.classifier_unit_guid order by um.document_date);

			--бегаем по таблице соответствия, для того, чтобы расставить количество использованных комплектующих
			DECLARE db_cursor_1 CURSOR FOR  
			select pr.classifier_unit_guid, (pr.unit_count * @minCount)
			from 
				#ProductRelation pr
			where 
				pr.classifier_product_guid = @classifier_product_guid and @date  between pr.start_timestamp and pr.end_timestamp
			
			OPEN db_cursor_1
			FETCH NEXT FROM db_cursor_1 INTO @classifier_unit_guid, @unit_count

			WHILE @@FETCH_STATUS = 0   
			BEGIN
				--высчитываем необходимое количество комплектующих и разбиваем их по "позициям"
				UPDATE #UnitMovement SET
					@unit_count = @unit_count - ( unit_count - isnull(used_count, 0) ), 
					 @used_count = used_count = isnull(used_count, 0) +
					  case 
					   when (case when @unit_count >= 0 then ( unit_count - isnull(used_count, 0) ) else @unit_count end) > 0 
						then (case when @unit_count >= 0 then ( unit_count - isnull(used_count, 0) ) else @unit_count end) 
					   when (case when @unit_count >= 0 then ( unit_count - isnull(used_count, 0) ) else @unit_count end) < 0 and (case when @unit_count >= 0 then ( unit_count - isnull(used_count, 0) ) else @unit_count end) + ( unit_count - isnull(used_count, 0) ) > 0 
						then (case when @unit_count >= 0 then ( unit_count - isnull(used_count, 0) ) else @unit_count end) + ( unit_count - isnull(used_count, 0) )  
					   else null end,
					   temp_guid = (case when @used_count is not null then @temp_guid else null end)
	    
				WHERE id in (select TOP 100 PERCENT id FROM #UnitMovement where classifier_unit_guid = @classifier_unit_guid order by document_date)
				
				FETCH NEXT FROM db_cursor_1 INTO @classifier_unit_guid, @unit_count   
			END   

			CLOSE db_cursor_1   
			DEALLOCATE db_cursor_1
			
			--обновляем оставшееся количество неиспользованных комплектующих
			UPDATE #UnitMovement set unit_count = unit_count - ISNULL(used_count,0);
			
			--вычисляем цену
			select @price = SUM(price * used_count) from #UnitMovement um where um.used_count is not null;
			SET @price = @price / @minCount;
			
			--вставляем готовую продукцию
			insert into #Product SELECT @classifier_product_guid, @minCount, @price;
		
			--удаляем и подчищаем таблицу
			DELETE FROM #UnitMovement WHERE unit_count = 0;
			UPDATE #UnitMovement set used_count = null, temp_guid = null;
			
			SET @product_count = @product_count - @minCount;
				
		END
	
	FETCH NEXT FROM db_cursor INTO @classifier_product_guid, @product_count  
	END   

CLOSE db_cursor   
DEALLOCATE db_cursor

--итого
SELECT classifier_product_guid, SUM(count), price FROM #Product GROUP By classifier_product_guid, price;
13 фев 12, 17:51    [12083538]     Ответить | Цитировать Сообщить модератору
 Re: подсчет себестоимости готового изделия  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
if OBJECT_ID('tempdb..#ProductRelation','U') IS NOT NULL DROP TABLE #ProductRelation
CREATE TABLE #ProductRelation(
id int IDENTITY(1,1) NOT NULL,
classifier_product_guid uniqueidentifier NOT NULL,
classifier_unit_guid uniqueidentifier not null,
unit_count int not null,
start_timestamp datetime,
end_timestamp datetime
)

INSERT INTO #ProductRelation 
--1-ое (А) готовое изделие
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', '84709A5C-8C98-4EFF-9347-58060D7B18FA', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'E54E7451-1A8F-48BB-AF59-11970E073796', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'A15A663C-8353-444A-9F93-557DC8E59FB9', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'C3A2DA53-6B7B-4D77-87CF-A924E12A7D58', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D8B22734-7D08-4EFA-A823-2080D42619CF', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select '7C09833D-7B66-4A98-86CB-0457AD5CEBD7', 'D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
--2-ое (Б) готовое изделие
select 'BDC02AE9-DE94-404C-AAC4-023991323515', '84709A5C-8C98-4EFF-9347-58060D7B18FA', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select 'BDC02AE9-DE94-404C-AAC4-023991323515', 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000' union
select 'BDC02AE9-DE94-404C-AAC4-023991323515', 'E54E7451-1A8F-48BB-AF59-11970E073796', 1, '2011-01-01 00:00:00.000', '9999-12-31 23:59:59.000'

if OBJECT_ID('tempdb..#UnitMovement','U') IS NOT NULL DROP TABLE #UnitMovement;
CREATE TABLE #UnitMovement(
id int IDENTITY(1,1) NOT NULL,
classifier_unit_guid uniqueidentifier not null,
unit_count int not null ,
price decimal(15,5) not null,
document_date datetime not null  --дата прихода
);

INSERT INTO #UnitMovement
select 'E54E7451-1A8F-48BB-AF59-11970E073796', 2, 9.00000, '2012-02-01 00:00:00.000' union
select 'E54E7451-1A8F-48BB-AF59-11970E073796', 18, 7.00000, '2012-02-02 00:00:00.000' union
select 'D8B22734-7D08-4EFA-A823-2080D42619CF', 15, 6.00000, '2012-02-08 00:00:00.000' union
select 'A15A663C-8353-444A-9F93-557DC8E59FB9', 15, 8.00000, '2012-02-08 00:00:00.000' union
select '84709A5C-8C98-4EFF-9347-58060D7B18FA', 20, 1.00000, '2012-02-08 00:00:00.000' union
select 'C3A2DA53-6B7B-4D77-87CF-A924E12A7D58', 15, 5.00000, '2012-02-08 00:00:00.000' union
select 'D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 4, 3.00000, '2012-02-02 00:00:00.000' union
select 'D9EB7846-34DF-4391-8568-CC3D2D74B8A7', 11, 4.00000, '2012-02-08 00:00:00.000' union
select 'D309B978-3CD0-48A2-A3CB-E0A05BB0CA59', 20, 2.00000, '2012-02-08 00:00:00.000' 

/*-------------------------------------------------------------------------*/

/*собрали 15 штук "А" и 5 штук "Б"*/
if OBJECT_ID('tempdb..#ProductMovement','U') IS NOT NULL DROP TABLE #ProductMovement;
SELECT '7C09833D-7B66-4A98-86CB-0457AD5CEBD7' classifier_product_guid, 15 unit_count  INTO #ProductMovement UNION
SELECT 'BDC02AE9-DE94-404C-AAC4-023991323515' classifier_product_guid, 5 unit_count 


if OBJECT_ID('tempdb..#Numbers','U') IS NOT NULL DROP TABLE #Numbers;
SELECT Number
 INTO #Numbers
FROM master..spt_values 
WHERE Type = 'P'

/*представляем каждую деталь из #UnitMovement располагаем отдельно*/
if OBJECT_ID('tempdb..#UnitMovementN','U') IS NOT NULL DROP TABLE #UnitMovementN;
CREATE TABLE #UnitMovementN (
id int IDENTITY(1,1) NOT NULL,
classifier_unit_guid uniqueidentifier not null,
UnitMovementID int NOT NULL
)
INSERT INTO #UnitMovementN (UnitMovementID, classifier_unit_guid)
  SELECT M.id, M.classifier_unit_guid
  FROM #UnitMovement M
  JOIN #Numbers N ON N.Number < M.unit_count
  ORDER BY M.classifier_unit_guid /*здесь решение очень зависит от сортировки!*/


/*представляем каждую деталь из собранных продуктов располагаем отдельно*/
if OBJECT_ID('tempdb..#ProductMovementN','U') IS NOT NULL DROP TABLE #ProductMovementN;
CREATE TABLE #ProductMovementN(
id int IDENTITY(1,1) NOT NULL,
classifier_product_guid uniqueidentifier not null,
classifier_unit_guid uniqueidentifier not null
)
INSERT INTO #ProductMovementN (classifier_product_guid, classifier_unit_guid)
  SELECT R.classifier_product_guid, R.classifier_unit_guid
  FROM #ProductRelation R
  JOIN #ProductMovement M ON M.classifier_product_guid = R.classifier_product_guid
  JOIN #Numbers N ON N.Number < M.unit_count*R.unit_count
  ORDER BY R.classifier_unit_guid /*здесь решение очень зависит от сортировки!*/


/*id детали в #ProductMovementN - номер изделия*/
if OBJECT_ID('tempdb..#ProductMovementNN','U') IS NOT NULL DROP TABLE #ProductMovementNN;
SELECT N1.id ProductMovementNID, count(N2.id) id
 INTO #ProductMovementNN
FROM #ProductMovementN N1
LEFT JOIN #ProductMovementN N2 ON N1.classifier_product_guid = N2.classifier_product_guid
								and N1.classifier_unit_guid = N2.classifier_unit_guid
								and N1.id > N2.id
GROUP BY N1.id

SELECT classifier_product_guid, Price, count(*)
FROM (
SELECT PN.classifier_product_guid, PNN.id, sum(M.Price) Price
FROM #UnitMovementN MN
JOIN #ProductMovementN PN ON PN.id = MN.id /*проставляем соответствие между деталями из #UnitMovementN и #ProductMovementN*/
JOIN #UnitMovement M ON M.id = MN.UnitMovementID 
JOIN #ProductMovementNN PNN ON PNN.ProductMovementNID = PN.id
GROUP BY PN.classifier_product_guid, PNN.id
) T
GROUP BY classifier_product_guid, Price


Некоторые временные таблицы в решении создаются только для его иллюстрации.
14 фев 12, 08:54    [12086267]     Ответить | Цитировать Сообщить модератору
 Re: подсчет себестоимости готового изделия  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
Небольшое уточнение.
При создании таблицы #ProductMovementN надо добавить сортировку по детали:
/*представляем каждую деталь из собранных продуктов располагаем отдельно*/
if OBJECT_ID('tempdb..#ProductMovementN','U') IS NOT NULL DROP TABLE #ProductMovementN;
CREATE TABLE #ProductMovementN(
id int IDENTITY(1,1) NOT NULL,
classifier_product_guid uniqueidentifier not null,
classifier_unit_guid uniqueidentifier not null
)
INSERT INTO #ProductMovementN (classifier_product_guid, classifier_unit_guid)
  SELECT R.classifier_product_guid, R.classifier_unit_guid
  FROM #ProductRelation R
  JOIN #ProductMovement M ON M.classifier_product_guid = R.classifier_product_guid
  JOIN #Numbers N ON N.Number < M.unit_count*R.unit_count
  ORDER BY R.classifier_unit_guid, R.classifier_product_guid /*здесь решение очень зависит от сортировки!*/


И мы увидим немного другой вариант решения:
Изделие Цена Кол-во
BDC02AE9-DE94-404C-AAC4-023991323515 10 3
BDC02AE9-DE94-404C-AAC4-023991323515 12 2
7C09833D-7B66-4A98-86CB-0457AD5CEBD7 32 4
7C09833D-7B66-4A98-86CB-0457AD5CEBD7 33 11


Лучшего способа, показать, что ваша задача может иметь несколько решений придумать не смог.
14 фев 12, 09:34    [12086385]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить