Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
where子句中列的SQL条件使用_Sql_Db2_Ibm Midrange - Fatal编程技术网

where子句中列的SQL条件使用

where子句中列的SQL条件使用,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,一点背景知识。我的公司已经开发了一个应用程序,它接受SQL查询,然后使用返回的值生成图形和K.P.I.s。在我的问题中,我们正在生成一个图形,以显示特定格式化日期的发货“路线”细分的订单总量 涉及两个表,订单标题(订单)和项目(项目) 程序需要将两个字段XAxis和YAxis传递给它以生成图形。我们希望生成的图形以路径引用(文本)作为XAxis,以项目总和作为YAxis 该路线会出现并发症。发送前的操作可以更改路由,新路由存储在不同的字段中;让我们调用这些OLDROUTE和NEWROUTE。如果

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

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

程序需要将两个字段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子句中重复。