where子句中列的SQL条件使用
一点背景知识。我的公司已经开发了一个应用程序,它接受SQL查询,然后使用返回的值生成图形和K.P.I.s。在我的问题中,我们正在生成一个图形,以显示特定格式化日期的发货“路线”细分的订单总量 涉及两个表,订单标题(where子句中列的SQL条件使用,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,一点背景知识。我的公司已经开发了一个应用程序,它接受SQL查询,然后使用返回的值生成图形和K.P.I.s。在我的问题中,我们正在生成一个图形,以显示特定格式化日期的发货“路线”细分的订单总量 涉及两个表,订单标题(订单)和项目(项目) 程序需要将两个字段XAxis和YAxis传递给它以生成图形。我们希望生成的图形以路径引用(文本)作为XAxis,以项目总和作为YAxis 该路线会出现并发症。发送前的操作可以更改路由,新路由存储在不同的字段中;让我们调用这些OLDROUTE和NEWROUTE。如果
订单
)和项目(项目
)
程序需要将两个字段XAxis和YAxis传递给它以生成图形。我们希望生成的图形以路径引用(文本)作为XAxis,以项目总和作为YAxis
该路线会出现并发症。发送前的操作可以更改路由,新路由存储在不同的字段中;让我们调用这些OLDROUTE
和NEWROUTE
。如果NEWROUTE
为空,则他们正在使用OLDROUTE
。如果NEWROUTE
有任何值,则将NEWROUTE用作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)=“包裹”
,则希望使用订单。ISSUEDATE
,对于route“盒子”
,则希望使用订单。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进行类似的查询,但没有成功。只需在一些附加过滤器中使用
或
:
WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR
(XAxis = 'Box' AND Orders.Packdate = @DATE))
只需在某些附加过滤器中使用
或
:
WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR
(XAxis = 'Box' AND Orders.Packdate = @DATE))
看看OP的原始代码,似乎OP不仅仅是有条件地选择行;它应该可以工作,但当尝试在AS/400绿色屏幕上运行时,它会生成消息“列XAXIS not in specified tables”。DB2似乎不喜欢在where子句中使用别名。似乎您必须使用视图或派生表来绕过它。将有一个多一点的发挥,看看会发生什么。@反之,通常情况下,您不能使用列别名在开始的选择在哪里。但是,您可以复制定义。根据上述建议,我修改了XAxis公式,使用字符串函数而不是case语句来计算它。然后在where子句中使用multiple
或
,以获得所需的功能。谢谢你的帮助。对于任何感兴趣的人,XAxis代码现在是:选择SUBSTR(TRIM(SUBSTR(ORDERS.NEWROUTE,1,6))| SUBSTR(ORDERS.OLDROUTE,1,6)作为XAxis
。where、group和order by子句中重复了这一点。查看OP的原始代码,似乎OP不仅仅是有条件地选择行;它应该可以工作,但当尝试在AS/400绿色屏幕上运行时,它会生成消息“列XAXIS not in specified tables”。DB2似乎不喜欢在where子句中使用别名。似乎您必须使用视图或派生表来绕过它。将有一个多一点的发挥,看看会发生什么。@反之,通常情况下,您不能使用列别名在开始的选择在哪里。但是,您可以复制定义。根据上述建议,我修改了XAxis公式,使用字符串函数而不是case语句来计算它。然后在where子句中使用multiple或
,以获得所需的功能。谢谢你的帮助。对于任何感兴趣的人,XAxis代码现在是:选择SUBSTR(TRIM(SUBSTR(ORDERS.NEWROUTE,1,6))| SUBSTR(ORDERS.OLDROUTE,1,6)作为XAxis
。这在where、group和order by子句中重复。