0

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の代わりに次のステートメントをさまざまな方法で使用しようとしましたが、クエリを実行できません。2つの日付のうち最新のものを使用するためのより良い方法はありますか?

SELECT CASE WHEN auxDate > infoDate 
            THEN auxDate 
            ELSE infoDate END AS activityDate 
FROM information 
LEFT JOIN otherDates 
       ON typeid = auxtypeid
4

3 に答える 3

0

CASEステートメントは、2つのフィールドの最新の値を選択するための最良の方法です。クエリが実行されないのはなぜですか?

CASEステートメントを追加したら...クエリのGROUPBY部分にもCASEステートメントも追加してください。

ああ、...そして、頭痛の種になる前に、state、typeなどの予約されたキーワードでフィールドを作成し ないことを検討することをお勧めします。

編集:おっと、DB2のタグが表示されませんでした

于 2013-03-26T16:51:23.823 に答える
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

...おそらくこれも速く実行されます。

LEFT JOINsをIDLE使用しているため、指定されたものに「idle」タイプがないpercent場合はnullになる可能性があることに注意してください。state

于 2013-03-26T20:23:13.137 に答える
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;
于 2013-03-26T20:47:56.377 に答える