Подвыбор оператора SQL Case внутри сгруппированного по подвыборке
Я не могу понять, как изменить свой запрос, чтобы использовать новейшую дату между information.infoDate и otherDates.auxDate.
SELECT state, COUNT(type) as EQUIPMENT,
(SELECT COUNT(type)
FROM information a
WHERE a.state = b.state
AND storedprocedures.to_date(infoDate) < (SELECT current date - 5 days
FROM sysibm.sysdummy1)
GROUP BY state) as IDLE,
ROUND((SELECT COUNT(type)
FROM information a
WHERE a.state = b.state
AND storedprocedures.to_date(infoDate) < (SELECT current date - 5 days
FROM sysibm.sysdummy1)
GROUP BY state) / CAST(COUNT(type) as float) * 100, 1) as percent
FROM information b
JOIN validStates
ON state = vstate
LEFT JOIN otherDates
ON typeid = auxtypeid
WHERE state <> '***'
GROUP BY state
ORDER BY state
Я пробовал использовать следующий оператор различными способами вместо infoDate, но я не могу заставить запрос выполняться. Есть ли лучший способ использовать новейшие из двух дат?
SELECT CASE WHEN auxDate > infoDate
THEN auxDate
ELSE infoDate END AS activityDate
FROM information
LEFT JOIN otherDates
ON typeid = auxtypeid
3 ответа
SELECT state,
COUNT (type) as EQUIPMENT,
(SELECT COUNT(type) FROM information a LEFT JOIN otherDates on typeid=auxtypeid WHERE a.state=b.state AND (CASE WHEN otherDate > infoDate THEN storedprocedures.dec_to_date(otherDate) ELSE storedprocedures.dec_to_date(infoDate) END) <= (select current date - 5 days from sysibm.sysdummy1) GROUP BY state) as IDLE,
ROUND((SELECT COUNT(type) FROM information a WHERE a.state=b.state AND (CASE WHEN otherDate > infoDate THEN storedprocedures.dec_to_date(otherDate) ELSE storedprocedures.dec_to_date(infoDate) END) < (select current date - 5 days from sysibm.sysdummy1) GROUP BY state)/ CAST(COUNT(type) as float)*100,1) as percent
FROM information b
JOIN validStates ON state=vstate
LEFT JOIN otherDates ON typeid=auxtypeid
WHERE state<>'***'
GROUP BY state
ORDER BY state;
Ваше утверждение CASE - лучший способ выбрать самое последнее значение из 2 полей. Почему не выполняется запрос?
Как только вы добавите оператор CASE... убедитесь, что вы также добавили оператор CASE в часть запроса GROUP BY.
О,... и прежде, чем у вас начнутся головные боли, вы можете не создавать поля с зарезервированными ключевыми словами, такими как состояние, тип и т. Д.
РЕДАКТИРОВАТЬ: Ой, я не видел тег DB2
Возможно, вам лучше будет сделать что-то вроде следующего (пока я не узнаю больше о вашей структуре / данных таблицы):
WITH Raw as (SELECT a.state,
MAX(a.infoDate, COALESCE(c.auxDate, '0001-01-01')) as activityDate
FROM information a
JOIN validStates b
ON b.vstate = a.state
LEFT JOIN otherDates c
ON typeId = auxtypeid
WHERE a.state <> '***'),
Total as (SELECT state, COUNT(*) as count
FROM Raw
GROUP BY state),
Idle as (SELECT state, COUNT(*) as count
FROM Raw
WHERE storedprocedures.to_date(activityDate) < (CURRENT_DATE - 5 DAYS)
GROUP BY state)
SELECT a.state, a.count as EQUIPMENT, b.count as IDLE,
ROUND((100.0 * b.count) / a.count, 1) as percent
FROM Total a
LEFT JOIN Idle b
ON b.state = a.state
ORDER BY a.state
... Который, вероятно, будет работать быстрее, тоже.
Обратите внимание, что из-за использования LEFT JOIN
s, IDLE
а также percent
может быть нулевым, если данный state
не имеет "холостых" типов.