读书人

急求case when then和group by联合使

发布时间: 2014-01-05 18:22:56 作者: rapoo

急求,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,



[解决办法]
引用:
Quote: 引用:

可以把a.IsClear 放到group by中

拜托这位大哥,我的确很尊重你,你说的这些我都明白,但是你的回答都不是我想要的,我现在的心情很急切……


有一个办法,就是必须得先把 下面的语句,先进行计算:

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

[解决办法]
引用:
Quote: 引用:

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类型不能聚合


bit类型就 1 和0两个值,为何要用max()聚合????完全是多此一举
[解决办法]
整理一下,大概就是这样:
select 
NoInSt_Amt= case
when a.IsClear=1 then


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


[解决办法]
引用:
Quote: 引用:

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
)


end,
如果对这个聚合,并不是对IsClear字段聚合,而是对你then后面的值进行聚合啊?你的IsClear仅仅是一个判断条件罢了,跟你的聚合与否没半点关系。把你的错误贴出来


如果对case when then 进行sum聚合,会出现这个错误:
消息 130,级别 15,状态 1,过程 QryPoOrdApDetails,第 44 行
不能对包含聚合或子查询的表达式执行聚合函数。


是的,聚合函数不能这样sum(...sum()...)只用。只能先把你第一次的聚合结果放到临时表,再来一次针对临时表这个字段的聚合
[解决办法]
那就把关联的那几张表的sql贴出来吧~

读书人网 >SQL Server

热点推荐