SQL where子句中列的条件使用



一点背景。我的公司制作了一个应用程序,该应用程序接受SQL查询,然后使用它返回的值生成图表和kpi。在我的问题中,我们正在生成一个图表,以显示特定格式化日期按发货"路由"分解的订单总量。

有两个表,order header (ORDERS)和items (ITEMS)。

程序需要传递两个字段,XAxis和YAxis来生成图形。我们希望生成的图形以Route Reference (Text)作为x轴,以项目的总和作为y轴。

术后并发症。调度前的操作可以改变路由,新的路由存储在不同的字段中;我们称它们为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

这很好。现在,当他们想要为特定路线使用不同的字段时,问题就来了。例如:对于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))

相关内容

  • 没有找到相关文章

最新更新