从SQLite数据库中的三个表中获取主、次主类别的总和

yhqotfr8  于 2023-01-31  发布在  SQLite
关注(0)|答案(1)|浏览(140)

我在SQLite数据库中有三个表;第一个表(PROJWBS)描述了项目工程和子工程,如下所示:
| 项目ID|WBS_标识|父代_WWBS_ID|WBS_名称|
| - ------|- ------|- ------|- ------|
| 1个|1个|无|主要工程|
| 1个|十个|1个|工作-01|
| 1个|十一|1个|工作-02|
第二个表(TASK)描述了工作任务:
| 任务编号|项目ID|WBS_标识|任务名称|
| - ------|- ------|- ------|- ------|
| 1个|1个|十个|平铺|
| 第二章|1个|十个|金属制品|
| 三个|1个|十一|木工厂|
第三个表(TASKRSRC)描述了任务的目标成本:
| 任务编号|项目ID|目标_成本|
| - ------|- ------|- ------|
| 1个|1个|五百|
| 1个|1个|七百五十|
| 第二章|1个|三百五十|
| 三个|1个|一百五十|
我创建此查询是为了按工程和子工程安排对第一个表进行排序,并计算工程和子工程成本:

SELECT 
    PROJWBS.Wbs_id, PROJWBS.Parent_Wbs_id, PROJWBS.Wbs_name,  
    COALESCE(subquery.Total_Cost, 0) AS Total_Cost 
FROM 
    PROJWBS 
LEFT JOIN 
    (SELECT 
         TASK.Wbs_id, SUM(TASKRSRC.Target_Cost) AS Total_Cost 
     FROM 
         TASK 
     JOIN 
         TASKRSRC ON TASK.Task_id = TASKRSRC.Task_id  
     GROUP BY 
         TASK.Wbs_id) AS subquery ON PROJWBS.Wbs_id = subquery.Wbs_id  
WHERE 
    PROJ_ID = 1
GROUP BY 
    PROJWBS.Wbs_id, PROJWBS.Parent_Wbs_id, PROJWBS.Wbs_name    
ORDER BY 
    CASE  
        WHEN PROJWBS.Wbs_id = PROJWBS.PARENT_WBS_ID THEN PROJWBS.PARENT_WBS_ID  
        WHEN PROJWBS.Wbs_id < PROJWBS.PARENT_WBS_ID THEN PROJWBS.WBS_ID   
        WHEN PROJWBS.Wbs_id > PROJWBS.PARENT_WBS_ID THEN PROJWBS.PARENT_WBS_ID 
    END;

结果表仅显示0个值 主要工程的费用,只计算子工程的费用。
注:主任务与任务表无关,子任务与任务表有关。
查询应返回如下结果(考虑查询中的顺序条件):
| WBS_标识|WBS_名称|合计_成本|
| - ------|- ------|- ------|
| 1个|主要工程|小行星1750|
| 十个|工作-01|小行星1600|
| 十一|工作-02|一百五十|
如有解决方案,将不胜感激。

hfwmuf9z

hfwmuf9z1#

考虑第二个聚集子查询,以便在项目级别对总成本求和:

SELECT p.WBS_ID, p.PARENT_WBS_ID, p.WBS_NAME,  
       COALESCE(main_agg.TOTAL_COST, sub_agg.TOTAL_COST, 0) AS TOTAL_COST 
FROM PROJWBS p
LEFT JOIN (  
    SELECT PROJ_ID, SUM(TARGET_COST) AS TOTAL_COST 
    FROM TASKRSRC  
    GROUP BY PROJ_ID
) AS main_agg
  ON p.PROJ_ID = main_agg.PROJ_ID
  AND p.PARENT_WBS_ID = 0
LEFT JOIN (  
    SELECT TASK.WBS_ID, SUM(TASKRSRC.TARGET_COST) AS TARGET_COST 
    FROM TASK 
    JOIN TASKRSRC ON TASK.TASK_ID = TASKRSRC.TASK_ID 
    GROUP BY TASK.WBS_ID
) AS sub_agg
   ON p.WBS_ID = sub_agg.WBS_ID
WHERE p.PROJ_ID = 1
ORDER BY ... ;

相关问题