epo*_*olf 0 sql-server group-by sql-server-2005
我有一个查询,检索从工厂收到的零件货件列表.收据列存储为当天的总收据,但当天有多个导入.这导致我们当前的查询多次报告一些货件.(我无法更改数据在数据库中的存储方式,而不会导致其他报告出现重大问题)
当前查询:
select ppl.plant_id, ppl.part_id, sum(pol.receipt) reciept
from purchase_order_levels pol
join plant_part_levels ppl
on ppl.id = pol.plant_part_level_id
join imports im
on im.id = ppl.import_id
where im.active = 1 and im.level_date <= '12-17-2010 10:26'
group by ppl.plant_id, ppl.part_id
Run Code Online (Sandbox Code Playgroud)
我尝试从一天结束时仅检索收据级别
select ppl.plant_id, ppl.part_id, DATEADD(dd, DATEDIFF(dd,0,ppl.level_date), 0) as level_date, max(pol.receipt) reciept
from mc_cup_purchase_order_levels pol
join mc_cup_plant_part_levels ppl
on ppl.id = pol.plant_part_level_id
join mc_cup_imports im
on im.id = ppl.import_id
where im.active = 1 and im.level_date <= '12-17-2010 10:26'
group by ppl.plant_id, ppl.part_id, DATEADD(dd, DATEDIFF(dd,0,ppl.level_date), 0)
Run Code Online (Sandbox Code Playgroud)
上面的查询有效,但我需要添加一个额外级别的分组来总结收据,当我尝试这样做时,我得到一个语法错误.它似乎不喜欢像子表一样处理子查询.
select plant_id, part_id, sum(pol.receipt) from
(
select ppl.plant_id, ppl.part_id, DATEADD(dd, DATEDIFF(dd,0,ppl.level_date), 0) as level_date, max(pol.receipt) reciept
from mc_cup_purchase_order_levels pol
join mc_cup_plant_part_levels ppl
on ppl.id = pol.plant_part_level_id
join mc_cup_imports im
on im.id = ppl.import_id
where im.active = 1 and im.level_date <= '12-17-2010 10:26'
group by ppl.plant_id, ppl.part_id, DATEADD(dd, DATEDIFF(dd,0,ppl.level_date), 0)
)
group by ppl.plant_id, ppl.part_id
Run Code Online (Sandbox Code Playgroud)
在数据上添加第二级分组的正确方法是什么?我正在尝试将此逻辑保留在数据库中,因此我不必重写应用程序来对内存中的数据求和.
使用公用表表达式(CTE):
;WITH My_CTE (plant_id, part_id, level_date, receipt) AS
(
select ppl.plant_id, ppl.part_id, DATEADD(dd, DATEDIFF(dd,0,ppl.level_date), 0) as level_date, max(pol.receipt) reciept
from mc_cup_purchase_order_levels pol
join mc_cup_plant_part_levels ppl
on ppl.id = pol.plant_part_level_id
join mc_cup_imports im
on im.id = ppl.import_id
where im.active = 1 and im.level_date <= '12-17-2010 10:26'
group by ppl.plant_id, ppl.part_id, DATEADD(dd, DATEDIFF(dd,0,ppl.level_date), 0)
)
select plant_id, part_id, sum(receipt) from My_CTE
group by plant_id, part_id
Run Code Online (Sandbox Code Playgroud)