一点背景知识。我的公司已经生成了一个接受SQL查询的应用程序,然后使用它返回的值来生成图形和K.P.I.s.在我的问题中,我们正在生成一个图表,显示按特定格式化日期的发货“路线”细分的订单总量。
涉及两个表,订单标题(ORDERS
)和项目(ITEMS
)。
该程序需要两个字段,XAxis和YAxis传递给它以生成图形。我们希望生成的图形具有路径参考(文本)作为XAxis,项目总和作为YAxis。
路线出现并发症。在发货之前的操作可以改变路线,新的路线存储在不同的领域;我们可以调用这些OLDROUTE
和NEWROUTE
。如果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进行类似的查询但是没有取得任何成功。
答案 0 :(得分:1)
在某些括号过滤器中使用OR
:
WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR
(XAxis = 'Box' AND Orders.Packdate = @DATE))