Немного фона. Моя компания выпустила приложение, которое принимает SQL-запрос, затем использует возвращаемые значения для создания графиков и K.P.I.s. В моей проблеме мы создаем график, показывающий общую сумму заказов, разбитых на «маршрут» отправки по определенной форматированной дате.SQL Условное использование столбцов в том, где статья
Имеются две таблицы, заголовок заказа (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
[email protected]
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 [email protected]
ELSE WHEN XAxis='BOX' then [email protected]
else [email protected] 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
Это не работает. Возможно ли использовать разные поля таблиц в случае case case clase? Они спрашивают больше, чем мы можем доставить?
Я пробовал аналогичный запрос, используя IF вместо CASE, но не добился успеха.
Глядя на оригинальном коде OP, это кажется, что OP делает больше, чем просто условно выбирающих строк. –
Очень простая идея; он должен работать, но при попытке запустить это на экране AS/400 Green он выдает сообщение «Столбец XAXIS не в указанных таблицах». Кажется, что DB2 не использует псевдоним в предложении where. Кажется, вам нужно использовать представление или производную таблицу, чтобы обойти его. Будет немного больше играть и посмотреть, что произойдет. – vice
@vice Как правило, вы не можете использовать псевдонимы столбцов в начале SELECT в WHERE. Однако вы могли бы дублировать определение. –