SQL Условное использование столбцов в предложении where - PullRequest
1 голос
/ 07 ноября 2011

Немного фона.Моя компания создала приложение, которое принимает запрос 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, но не добился успеха.

1 Ответ

1 голос
/ 07 ноября 2011

Просто используйте OR в некоторых круглых фильтрах:

WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR
      (XAxis = 'Box' AND Orders.Packdate = @DATE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...