Немного фона.Моя компания создала приложение, которое принимает запрос SQL, а затем использует возвращаемые значения для создания графиков и KPI. В моей задаче мы создаем график, показывающий общее количество заказов с разбивкой по «маршруту» отправки для определенного отформатированногодата.
Здесь задействованы две таблицы: заголовок заказа (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, но не добился успеха.