原始表数据结构
名称 数量 单价 总金额
根1 500 500 250000
子1 100 500 50000
子2 100 500 50000
子3 100 500 50000
子4 100 500 50000
子5 100 500 50000
根2 300 50 15000
根2_子1 100 50 5000
根2_子2 100 50 5000
根2_子3 100 50 5000
根3 0 0 0
查询后得到以下结果:
名称 数量 单价 总金额
根1 500 500 250000
子1 100 500 50000
子2 100 500 50000
子3 100 500 50000
子4 100 500 50000
[b]合计 500 2500 250000[/b]
根2 300 50 15000
根2_子1 100 50 5000
根2_子2 100 50 5000
根2_子3 100 50 5000
[b]合计 300 150 15000[/b]
根3 0 0 0
这里主要是,根和子是父子关系,表里面有个 PID ,统计时只要统计子的[b]合计[/b]
你这个属于层次查询了,如果父子关系就是两层的话,可以这么写
[code="sql"]SELECT m.*
FROM (SELECT 'x' id,
'合计' text,
t1.pid,
SUM(t1.size) size,
SUM(t1.price) price,
SUM(t1.totalPrice) totalPrice
FROM hudc.dbo.test2 t1
WHERE t1.pid > 0
GROUP BY t1.pid
UNION ALL
SELECT CAST(t2.id AS VARCHAR),
t2.text,
t2.pid,
t2.size,
t2.price,
t2.totalPrice
FROM hudc.dbo.test2 t2) m
ORDER BY CASE
WHEN CAST(m.pid AS VARCHAR) = '0' THEN
CAST(m.id AS VARCHAR)
ELSE
CAST(m.pid AS VARCHAR) + '_' + CAST(m.id AS VARCHAR)
END[/code]
如果层数不固定的话,在sql 2000下不好实现,sql 2005提供了层次查询函数。
你把创建表结构贴上
你数据是不是有问题,我理解原表数据应该
[code="java"]根1 500 500 250000
根1_子1 100 500 50000
根1_子2 100 500 50000
根1_子3 100 500 50000
根1_子4 100 500 50000
根1_子5 100 500 50000
根2 300 50 15000
根2_子1 100 50 5000
根2_子2 100 50 5000
根2_子3 100 50 5000
根3 0 0 0
[/code]
[code="sql"]SELECT CASE WHEN RIGHT(m.rootName, 1) = '_'
THEN '合计'
ELSE m.rootName END
rootName,
m.amount,
m.price,
m.total_amount
FROM (SELECT SUBSTRING(t.root_name, 1, CHARINDEX('_', t.root_name)) AS rootName,
SUM(amount) amount,
SUM(price) price,
SUM(total_amount) total_amount
FROM hudc.dbo.test t
WHERE CHARINDEX('_', t.root_name) > 0
GROUP BY SUBSTRING(t.root_name, 1, CHARINDEX('_', t.root_name))
UNION ALL
SELECT t2.* FROM hudc.dbo.test t2) m
ORDER BY CASE WHEN RIGHT(m.rootName, 1) = '_'
THEN m.rootName + '子子'
ELSE m.rootName END[/code]