2013-03-26 59 views
0

我无法弄清楚如何修改我的查询以使用information.infoDate和otherDates.auxDate之间的最新日期。SQL Case语句子选择按子查询分组

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'函数,无论您的目标格式是什么(为什么不存储在日期/时间/时间戳类型中)? – 2013-03-26 19:58:38

回答

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语句是选择2个字段的最新值的最佳方法。为什么不运行查询?

一旦添加CASE语句...确保您还将CASE语句添加到查询的GROUP BY部分。

哦...你头疼的道路之前 - 你可能要考虑与保留关键字状态,类型等作出领域

编辑:哎呀我没有看到DB2

+0

因此,如果您要插入case case语句,那么infoDate是如何按case语句分组?我无法按activityDate分组。 – BearSkyview 2013-03-26 17:04:50

+0

如果你可以回答w/SQL与你的case语句失败,也许我可以帮忙。 我一开始没有看到DB2。在MS SQL中,您需要通过CASE语句进行分组...在DB2中,您可以简单地将GROUP BY作为case语句的别名...就像GROUP BY activityDate – Josh 2013-03-26 17:37:48

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 S,IDLEpercent可以为null如果给定state没有“空闲”类型。