急求,case when then和group by联合使用的问题NoInSt_Amtcasewhena.IsClear1 then0else(select sum(case
急求,case when then和group by联合使用的问题
NoInSt_Amt=case when a.IsClear=1 then 0 else (select sum(case when m.Ac_Qty > 0 and m.Qty > m.Ac_Qty then (m.Fc_Tot / m.Qty) * (m.Qty - m.Ac_Qty) when m.Ac_Qty = 0 then m.Fc_Tot else 0 end ) from PoOrdD m where a.OrderM_Id = m.OrderM_Id ) end,
如代码所示:我在此查询中使用了case when then,现在问题是,我在后面使用group by时,由于when a.IsClear=1 then这句没有在聚合函数中,所以会报错,但是IsClear字段为bit类型,无法使用聚合函数,因此不知道该怎么解决,求各位大神指教。还有一个问题就是,为什么a.OrderM_Id也会报错,这个只是在where条件中啊,我不想根据a.OrderM_Id去分组 [解决办法] try this,
NoInSt_Amt=case when max(a.IsClear)=1 then 0 else (select sum(case when m.Ac_Qty>0 and m.Qty > m.Ac_Qty then (m.Fc_Tot/m.Qty)*(m.Qty-m.Ac_Qty) when m.Ac_Qty = 0 then m.Fc_Tot else 0 end) from PoOrdD m where a.OrderM_Id=m.OrderM_Id) end,
[解决办法]
有一个办法,就是必须得先把 下面的语句,先进行计算:
1. select sum(case when m.Ac_Qty > 0 and m.Qty > m.Ac_Qty then (m.Fc_Tot / m.Qty) * (m.Qty - m.Ac_Qty) when m.Ac_Qty = 0 then m.Fc_Tot else 0 end ) as xxx from PoOrdD m group by m.OrderM_Id --where a.OrderM_Id = m.OrderM_Id
2.然后把上面的结果集 在和 那个a 表的OrderM_Id字段关联
3. NoInSt_Amt=case when a.IsClear=1 then 0 else xxx end
4.在group by中 也加上: case when a.IsClear=1 then 0 else xxx end
[解决办法]
try this,
NoInSt_Amt=case when max(a.IsClear)=1 then 0 else (select sum(case when m.Ac_Qty>0 and m.Qty > m.Ac_Qty then (m.Fc_Tot/m.Qty)*(m.Qty-m.Ac_Qty) when m.Ac_Qty = 0 then m.Fc_Tot else 0 end) from PoOrdD m where a.OrderM_Id=m.OrderM_Id) end,
这个也不行的,会报这个错误: 消息 8117,级别 16,状态 1,过程 QryPoOrdApDetails,第 33 行 操作数数据类型 bit 对于 max 运算符无效。 bit类型不能聚合
0 else xxx end from a left join ( select m.OrderM_Id,sum(case when m.Ac_Qty > 0 and m.Qty > m.Ac_Qty then (m.Fc_Tot / m.Qty) * (m.Qty - m.Ac_Qty) when m.Ac_Qty = 0 then m.Fc_Tot else 0 end ) as xxx from PoOrdD m group by m.OrderM_Id )m on a.OrderM_Id = m.OrderM_Id group by 其他字段,case when a.IsClear=1 then 0 else xxx end
[解决办法]
a.IsClear是bit类型,的确不能用来聚合,但是你的 case when a.IsClear=1 then 0 else (select sum(case when m.Ac_Qty > 0 and m.Qty > m.Ac_Qty then (m.Fc_Tot / m.Qty) * (m.Qty - m.Ac_Qty) when m.Ac_Qty = 0 then m.Fc_Tot else 0 end ) from PoOrdD m where a.OrderM_Id = m.OrderM_Id )