Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

Древовидный несбалансированный справочник, как собрать факт

$
0
0
Всем привет

Есть справочник, несбалансированный древовидный.
автор
ROOT_LEVEL_ID ARTICLE_ID ARTICLE_NAME LEVEL IS_LEAF
1 1. Основной уровень 1 0 0
1 1.1 Статья уровня 1.1 1 1
1 1.2 Статья уровня 1.2 1 0
1 1.2.1 Статья уровня 1.2.1 2 1
1 1.2.2 Статья уровня 1.2.2 2 1
1 1.2.3 Статья уровня 1.2.3 2 1
1 1.3 Статья уровня 1.3 1 1
2 2. Основной уровень 2 0 0
2 2.1 Статья уровня 2.1 1 1

IF OBJECT_ID('tempdb..#tArticles') IS NOT NULL
	DROP TABLE #tArticles;
IF OBJECT_ID('tempdb..#tTrans') IS NOT NULL
	DROP TABLE #tTrans;

CREATE TABLE #tArticles(
	[ROOT_LEVEL_ID] [nvarchar](20) NULL,
	[ARTICLE_ID] [nvarchar](20) NULL,
	[ARTICLE_NAME] [nvarchar](100) NULL,
	[LEVEL] [int] NULL,
	[IS_LEAF] [int] NULL
) ON [PRIMARY];

CREATE TABLE #tTrans(
	[ARTICLE_ID] [nvarchar](20) NULL,
	[AMOUNT] float
) ON [PRIMARY];


INSERT INTO #tArticles (ROOT_LEVEL_ID, [ARTICLE_ID], [ARTICLE_NAME], [LEVEL], [IS_LEAF])
VALUES ('1', '1.', 'Основной уровень 1', 0, 0),
	 ('1', '1.1', 'Статья уровня 1.1', 1, 1),
	 ('1', '1.2', 'Статья уровня 1.2', 1, 0),
	 ('1', '1.2.1', 'Статья уровня 1.2.1', 2, 1),
	 ('1', '1.2.2', 'Статья уровня 1.2.2', 2, 1),
	 ('1', '1.2.3', 'Статья уровня 1.2.3', 2, 1),
	 ('1', '1.3', 'Статья уровня 1.3', 1, 1),
	 ('2', '2.', 'Основной уровень 2', 0, 0),
	 ('2', '2.1', 'Статья уровня 2.1', 1, 1);

 INSERT INTO #tTrans (ARTICLE_ID, AMOUNT)
 VALUES ('1.2.1', 12),
	('1.2.2', 3),
	('1.2.3', 5),
	('1.2.3', 10),
	('2.1', 100),
	('1.1', 55);


SELECT * FROM #tArticles ORDER BY ARTICLE_ID;
SELECT * FROM #tTrans;


Необходимо по этому справочнику собрать факт снизу вверх таким образом, чтобы с листьев факт собирался по транзакциям, а на уровни выше - уже по собранным статьям
Типа:
Статья уровня 1.1 = 55
Статья уровня 1.2.1 сумма 12
Статья уровня 1.2.2 сумма 3
Статья уровня 1.2.3 сумма 5+10 = 15
Статья уровня 1.2 сумма 12 + 3 + 15 = 30
Статья уровня 1 сумма 55 + 30 = 85

Не могу придумать запрос, подскажите направление, пожалуйста :)

Спасибо!

Viewing all articles
Browse latest Browse all 7251

Trending Articles