首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

急求,case when then和group by联合使用的有关问题

2014-01-05 
急求,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,



[解决办法]
引用:
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贴出来吧~

热点排行