maysamfth Ответов: 1

Сумма всех дочерних и родительских данных в иерархических данных


привет У меня есть 2 таблицы на продажу с поля:

saleDetail (id, commodityID, count, price, ...)
товар (id, parentID, имя)

таблица товаров является иерархической или рекурсивной.

Вот мои тестовые данные

товар

идентификатор атрибутом parentId---- имя
1-- ноль-- продукты
2-- 1-- фрукты
3-- 2-- яблоко
4-- 2-- оранжевый
5-- 2-- дыня
6-- 1-- продукт моря
7-- 6-- лосось
8-- 6-- креветки


saleDetail

commodityID-- граф-- цена
3-- 1-- 100
4-- 1-- 150
5-- 1-- 200
7-- 1-- 110
8-- 1-- 180
4-- 1-- 160


Мне нужен отчет, как показано ниже:


имя-- всего
продукты питания-900 (сумма всех рекордов)
фрукты - 610 (сумма 3, 4, 5)
яблоко - 100 (сумма 3)
оранжевый - 310 (сумма 4)
дыня - 200 (сумма 5)
морепродукты - 290 (сумма 7, 8)
лосось - 110 (сумма 7)
креветки - 180 (сумма 8)

Что я уже пробовал:

это мой sql запрос но не правильный ответ:

С деревом как
(
--инициализация
Выберите id, parentid, имя
От товара
Где parentID равен нулю
СОЮЗ ВСЕХ
--рекурсивное выполнение
Выберите e.id, e.parentid, e.name
С товаром электронное внутреннее соединение дерево м
На эл.атрибутом parentId = м.идентификатор
)
--Выберите * из дерева
выберите имя, сумму(count*price) в качестве итога из правого внешнего соединения дерева
saleDetail на дерево.ИД = saleDetail.commodityID
группа по названию

результат; что общее количество родителей не подсчитано

имя-- всего
яблоко - 100
дыня - 200
оранжевый - 310
лосось - 110
креветки - 180

1 Ответов

Рейтинг:
6

Maciej Los

Проверить это:

DECLARE @commodity TABLE(id INT IDENTITY(1,1), parentID INT, [name] VARCHAR(30))
INSERT INTO @commodity(parentID, [name])
VALUES(null, 'foods'),
(1, 'fruits'),
(2, 'apple'),
(2, 'orange'),
(2, 'melon'),
(1, 'sea foods'),
(6, 'salmon'),
(6, 'shrimp')


DECLARE @saleDetail TABLE(commodityID INT, [count] INT, price INT)
INSERT INTO @saleDetail (commodityID, [count], price)
VALUES(3, 1, 100),
(4, 1, 150),
(5, 1, 200),
(7, 1, 110),
(8, 1, 180),
(4, 1, 160)

;WITH tree AS
(
	--initial part
	SELECT c.ID, c.parentID, c.[name], sd.[count] AS countOfItems, sd.price
	FROM @saleDetail AS sd INNER JOIN @commodity AS c ON sd.commodityID = c.id 
	UNION ALL
	--recursive part
	SELECT c.ID, c.parentID, c.[name], t.countOfItems, t.price 
	FROM @commodity AS c INNER JOIN tree AS t ON c.id = t.parentID 
)
SELECT t.[name], SUM(t.countOfItems * t.price) AS total
FROM tree AS T
GROUP BY t.[name]


Результат:
name	total
apple	100
foods	900
fruits	610
melon	200
orange	310
salmon	110
sea foods	290
shrimp	180


maysamfth

идеальный. так что спасибо. Это сработало.

Maciej Los

Всегда пожалуйста.