SQL条件使用where子句中的列

时间:2011-11-07 16:04:01

标签: sql db2 ibm-midrange

一点背景知识。我的公司已经生成了一个接受SQL查询的应用程序,然后使用它返回的值来生成图形和K.P.I.s.在我的问题中,我们正在生成一个图表,显示按特定格式化日期的发货“路线”细分的订单总量。

涉及两个表,订单标题(ORDERS)和项目(ITEMS)。

该程序需要两个字段,XAxis和YAxis传递给它以生成图形。我们希望生成的图形具有路径参考(文本)作为XAxis,项目总和作为YAxis。

路线出现并发症。在发货之前的操作可以改变路线,新的路线存储在不同的领域;我们可以调用这些OLDROUTENEWROUTE。如果NEWROUTE为空,那么他们正在使用OLDROUTE。如果NEWROUTE有任何价值,请使用NEWROUTE as XAxis

我们表格中使用的日期是一个整数,格式为YYMMDD。动态生成它的代码为

@DATE=(((year(curdate())-2000)*10000)+(month(curdate())*100)+(day(curdate()))) 

将其与字段DESPDATE进行比较,以获取今天完成的所有订单。

我有一个可行的版本,发布在

下面
select CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end AS XAxis,  SUM(ITEMS.QUANTITY) as YAxis
FROM ORDERS
join ITEMS
on ORDERS.ORDNUM=ITEMS.ORDNUM
where 
ORDERS.DESPDATE=@DATE    
and ORDERS.STATUS='COMPLETE'
group by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end
order by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end

这很好用。现在,当他们想要为特定路线使用不同的场时,会出现复杂情况。例如:对于路由(XAxis)= 'PARCEL',然后想要使用ORDERS.ISSUEDATE,路由'BOX'他们想要使用ORDERS.PACKDATE以及他们想要的其他所有内容同样的。

所以新代码应该是这样的:

select CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end AS XAxis,  SUM(ITEMS.QUANTITY) as YAxis
FROM ORDERS
join ITEMS
on ORDERS.ORDNUM=ITEMS.ORDNUM
where 
CASE WHEN XAxis='PARCEL' then ORDERS.ISSUEDATE=@DATE 
ELSE WHEN XAxis='BOX' then ORDERS.PACKDATE=@DATE
else ORDERS.DESPDATE=@DATE end
and ORDERS.STATUS='COMPLETE'
group by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end
order by CASE WHEN ORDERS.NEWROUTE='' then substr(ORDERS.OLDROUTE) else substr(ORDERS.NEWROUTE,1,6) end

这不起作用。实际上可以在where clase case语句中使用不同的表字段吗?他们的要求是否超出我们的要求?

我尝试使用IF而不是CASE进行类似的查询但是没有取得任何成功。

1 个答案:

答案 0 :(得分:1)

在某些括号过滤器中使用OR

WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR
      (XAxis = 'Box' AND Orders.Packdate = @DATE))