2013-03-26 1 views
0

Я не могу понять, как изменить мой запрос, чтобы использовать самую новую дату между information.infoDate и otherDates.auxDate.SQL case statement subselect в сгруппированном подзапросом

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 
+0

Можем ли мы, возможно, получить некоторые исходные данные образца/желаемый результат вывода? Какая версия/платформа DB2? И есть ли рефлексивная функция 'from_date' в любом формате назначения (почему не сохраняется в типе даты/времени/времени)? –

ответ

0
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; 
0

Ваш оператор CASE - это лучший способ выбрать последнее значение из двух полей. Почему не выполняется запрос?

Как только вы добавите заявление CASE ... убедитесь, что вы также добавили оператор CASE в часть запроса GROUP BY.

О, ... и прежде чем вы получите головную боль вниз по дороге - вы можете рассмотреть не делая поля с зарезервированными ключевыми словами, такие как состояние, тип и т.д.

EDIT: по электронной почте Ой я не вижу тег DB2

+0

Итак, если вы должны были вставить этот аргумент case, где infoDate - это то, как вы бы группировали оператор case? Я не могу группировать по ActivityDate. – BearSkyview

+0

Если вы можете ответить на SQL с аргументом case, который не работает, возможно, я могу помочь. Сначала я не видел DB2. В MS SQL вам нужно сгруппировать с помощью оператора CASE ... в DB2, возможно, вы можете просто GROUP BY по псевдониму case case ... например GROUP BY activityDate – Josh

0

Вы можете иметь лучшее время делать что-то вроде следующего (пока я не знаю больше о вашей структуре таблицы/данные):

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 

... Which'll вероятно, работать быстрее, тоже.

Пожалуйста, обратите внимание, что из-за использование LEFT JOIN с, IDLE и percent может быть пустыми, если данный state не имеет «холостые» типов.