2011-11-07 2 views
1

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

ответ

1

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

WHERE ((XAxis = 'Parcel' AND Orders.Issuedate = @DATE) OR 
     (XAxis = 'Box' AND Orders.Packdate = @DATE)) 
+0

Глядя на оригинальном коде OP, это кажется, что OP делает больше, чем просто условно выбирающих строк. –

+0

Очень простая идея; он должен работать, но при попытке запустить это на экране AS/400 Green он выдает сообщение «Столбец XAXIS не в указанных таблицах». Кажется, что DB2 не использует псевдоним в предложении where. Кажется, вам нужно использовать представление или производную таблицу, чтобы обойти его. Будет немного больше играть и посмотреть, что произойдет. – vice

+0

@vice Как правило, вы не можете использовать псевдонимы столбцов в начале SELECT в WHERE. Однако вы могли бы дублировать определение. –

Смежные вопросы