一点背景。我的公司制作了一个应用程序,该应用程序接受SQL查询,然后使用它返回的值生成图表和kpi。在我的问题中,我们正在生成一个图表,以显示特定格式化日期按发货"路由"分解的订单总量。
有两个表,order header (ORDERS
)和items (ITEMS
)。
程序需要传递两个字段,XAxis和YAxis来生成图形。我们希望生成的图形以Route Reference (Text)作为x轴,以项目的总和作为y轴。
术后并发症。调度前的操作可以改变路由,新的路由存储在不同的字段中;我们称它们为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
这很好。现在,当他们想要为特定路线使用不同的字段时,问题就来了。例如:对于route (XAxis) = 'PARCEL'
,他们想使用ORDERS.ISSUEDATE
,对于route '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
这不起作用。实际上是可以使用不同的表字段在哪里类情况下的声明?他们的要求超出了我们的能力吗?
我尝试了一个类似的查询使用IF而不是CASE,但没有任何成功。
只需在一些括号过滤器中使用OR
:
WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR
(XAxis = 'Box' AND Orders.Packdate = @DATE))