是否有解决方法可以在循环 CTE 内使用 GROUP BY 或者有解决方法?
我需要对 CTE 表的结果集进行分组,并在具有相同 CTE 的另一个循环中使用它,但出现以下错误:
不允许使用 GROUP BY、HAVING 或聚合函数
递归公用表表达式“cte”的递归部分。
这是查询:
WITH cte
AS
(
SELECT
id,
dailyconsumption,
stock/dailyconsumption as cutoff
FROM items
WHERE father IS NULL
UNION ALL
SELECT
i.id,
SUM(father.dailyconsumption*i.num),
MAX(stock)/SUM(father.dailyconsumption*i.num)
FROM cte father
JOIN items i ON father.id=i.father
group by i.id
)
SELECT id, MIN(cutoff)
FROM cte
GROUP BY id
SQL-Fiddle http://sqlfiddle.com/#!3/f4f2a/11(带有样本数据)
编辑...这是逻辑问题
我有一组最终用户项目(father=NULL)和由许多其他项目(填充的字段father和字段num)制成的其他子项目。
我得到了最终用户项目的每日消耗(我以“WHEREfather IS NULL”开始我的cte),子项目的每日消耗由SUM(father.dailyconspiration *item.num)计算。
WITH cte AS(
SELECT
id,
dailyconsumption,
stock/dailyconsumption as cutoff
FROM items
WHERE father IS NULL
UNION ALL
SELECT
i.id,
father.dailyconsumption*i.num
0
FROM cte father
JOIN items i ON father.id=i.father
)
SELECT id, SUM(dailyconsumption)
FROM cte
GROUP BY id
http://sqlfiddle.com/#!3/f4f2a/95 http://sqlfiddle.com/#!3/f4f2a/95
有了这个valid查询我将为所有项目(最终用户和子项目)填充所有每日消耗。请注意,父子关系的深度可能超过 1 级。
现在我需要计算截止日期(我的库存足够多少天)。
对于最终用途来说,这非常简单,并且已经在第一个 CTE 中进行了计算:库存/每日消耗。
对于子项目来说,情况稍微复杂一些:subitem.stock/subitem.dailyconspiration + MIN(father.cutoff)其中 MIN(father.cutoff) 是该子项的所有父项的最小截止值。
这是因为我需要另一个分组依据。
我是否需要另一个 CTE 来循环同一父子关系?
感谢您的关注,并对我的英语表示抱歉。