在此示例中,我采用不是“Manu”(制造商)的独特产品。为确保所需输出的第一行的排序,我为该行赋予了一个子整数 = 1,对于 column theOrder
。我对“Manu”数据进行子查询,假设您需要平均值,这是针对“香草蛋糕”的制造商产品行。
我将所有这些与子产品详细信息联合起来,给它一个子订单 int = 2, theOrder
。在您想要的输出中空白的列我保留为 NULL。
整个事情都是子查询的,我用 case 语句来清空列,类似于您想要的输出。这是使用制造商产品名称和theOrder
列的组合进行排序的,因此应首先列出主要产品,然后是子产品。
DECLARE @temp TABLE ([Manufacture Product] varchar(100), [Sub Product] varchar(100), [Required Qty / Unit] decimal(16,2), [Purchase Qty] decimal(16,2)
, [Return Qty] decimal(16,2)
,[Issue Qty] decimal(16,2), [Damage Qty] decimal(16,2), [Balance Qty] decimal(16,2), [Estimate Qty] decimal(16,2)
,[Sale Qty] decimal(16,2), [Damage] decimal(16,2), [Avail Qty] decimal(16,2))
INSERT INTO @temp
VALUES ('manu', '2 GOOD' , 34.00, 502.00, 0.00, 0.00, 0.00, 502.00, 14.71, 0.00, 0.00, 14.71)
,('manu', 'CHOCO AL...', 34.00, 500.00, 0.00, 0.00, 0.00, 500.00, 14.71, 0.00, 0.00, 14.71)
,('Vanila Cake', 'Butter Cream', 10.00, 600.00, 0.00, 72.00, 0.00, 528.00, 52.80, 0.00, 0.00, 52.80)
,('Vanila Cake', 'Eggs' , 2.00,1000.00, 0.00, 37.00, 0.00, 963.00, 52.80, 0.00, 0.00, 52.80)
,('Vanila Cake', 'Flour' , 5.00, 0.00, 0.00, 0.00, 0.00, 500.00, 52.80, 0.00, 0.00, 52.80)
SELECT CASE WHEN theOrder = 1 THEN [Manufacture Product] ELSE '' END [Manufacture Product]
,CASE WHEN theOrder = 2 THEN [Sub Product] ELSE '' END [Sub Product]
,[Required Qty / Unit]
,[Purchase Qty]
,[Return Qty]
,[Issue Qty]
,[Damage Qty]
,[Balance Qty]
,[Estimate Qty]
,[Sale Qty]
,Damage
,[Avail Qty]
FROM (
SELECT DISTINCT
1 [theOrder]
,T.[Manufacture Product]
,'' [Sub Product]
,NULL [Required Qty / Unit]
,NULL [Purchase Qty]
,NULL [Return Qty]
,NULL [Issue Qty]
,NULL [Damage Qty]
,NULL [Balance Qty]
,(SELECT AVG(T2.[Estimate Qty]) FROM @temp T2 WHERE T2.[Manufacture Product] = 'Manu') [Estimate Qty]
,(SELECT AVG([Sale Qty]) FROM @temp T2 WHERE T2.[Manufacture Product] = 'Manu') [Sale Qty]
,(SELECT AVG([Damage]) FROM @temp T2 WHERE T2.[Manufacture Product] = 'Manu') [Damage]
,(SELECT AVG([Avail Qty]) FROM @temp T2 WHERE T2.[Manufacture Product] = 'Manu') [Avail Qty]
FROM @temp T
WHERE T.[Manufacture Product] <> 'Manu'
UNION ALL
SELECT 2 [theOrder]
,T.[Manufacture Product]
,T.[Sub Product]
,T.[Required Qty / Unit]
,T.[Purchase Qty]
,T.[Return Qty]
,T.[Issue Qty]
,T.[Damage Qty]
,T.[Balance Qty]
,NULL [Estimate Qty]
,NULL [Sale Qty]
,NULL [Damage]
,NULL [Avail Qty]
FROM @temp T
WHERE T.[Manufacture Product] <> 'Manu'
) AS dT
ORDER BY dT.[Manufacture Product], dT.theOrder, dT.[Sub Product]
这会产生类似于您所要求的输出。NULLS 可以由报告工具处理。
仅供参考,我在 SSRS 等报告工具中更容易做到这一点。如果是 SSRS,我会为 Manufacture Product 创建一个父列。