I’m developing a software for Consumer price index calculation and one step of all calculation is to calculate product weights in product category. This should be done in SQL server side. I have MS SQL Server 2008. The product catalog are stored in a tree:
x
|id|ProductCode|ParentId|Weight|
--------------------------------
|1 |01 |NULL |0 |
|2 |01.1 | 1 |0 |
|3 |01.1.1 | 2 |0 |
|4 |01.1.1.101 | 3 |0.14 |
|5 |01.1.1.102 | 3 |0.1 |
|6 |01.1.1.103 | 3 |0.25 |
|7 |01.1.1.104 | 3 |0.02 |
|8 |01.1.2 | 2 |0 |
|9 |01.1.2.201 | 8 |0.05 |
|10|01.1.2.202 | 8 |0.3 |
--------------------------------
It is simplified structure of my table, so i need to calculate weights for categories.
For example:
- weight for category ‘01.1.1’ = sum of product weight 01.1.1.101 + 01.1.1.102 + 01.1.1.103 + 01.1.1.104 =0.51
- for category ‘01.1.2’ = sum of 01.1.2.201 + 01.1.2.201 = 0.35
- for category 01.1 = sum of 01.1.1 +01.1.2 =0.51 +0.35 = 0.86
- for category 01 = sum of 01.1 + 01.2 (not showed in my example)
And my problem actually is, I can’t calculate weights of parent categories.
Maybe someone can help me to solve my problem? Thank you!
Advertisement
Answer
I think Joakim’s answer does not give the correct result.
Perhaps this will work:
-- Use a safe database
use tempdb
if object_id('Products') is not null drop table Products
create table Products (
id int,
ProductCode varchar(100),
ParentId int,
Weight float
)
-- Original sample data
insert into Products (id,ProductCode, ParentId, Weight)
SELECT 1 ,'01', NULL ,'0' UNION ALL
SELECT 2 ,'01.1' , '1' ,'0' UNION ALL
SELECT '3 ','01.1.1',' 2 ','0 ' UNION ALL
SELECT '4 ','01.1.1.101',' 3 ','0.14 ' UNION ALL
SELECT '5 ','01.1.1.102',' 3 ','0.1 ' UNION ALL
SELECT '6 ','01.1.1.103',' 3 ','0.25 ' UNION ALL
SELECT '7 ','01.1.1.104',' 3 ','0.02 ' UNION ALL
SELECT '8 ','01.1.2',' 2 ','0 ' UNION ALL
SELECT '9 ','01.1.2.201',' 8 ','0.05 ' UNION ALL
SELECT '10','01.1.2.202',' 8 ','0.3 '
-- Extra test data
insert into Products (id,ProductCode, ParentId, Weight)
SELECT 11 ,'01.2', 1 ,'1.1'
-- Calculate result
select b.ProductCode, SUM(a.Weight) as WeightSum
from Products a
join Products b on b.ProductCode = left(a.ProductCode, len(b.ProductCode)) and len(b.ProductCode) < len(a.ProductCode)
group by b.ProductCode
Result:
ProductCode WeightSum
01 1,96
01.1 0,86
01.1.1 0,51
01.1.2 0,35