【问题标题】:Query with Interval in Oracle (using JFreeChart)Oracle 中的间隔查询(使用 JFreeChart)
【发布时间】:2013-10-21 19:47:58
【问题描述】:

我正在组装一个查询以在 JFreeChart 中显示一个实验。查询工作正常,但不是在 JFreeChart 中显示。它将间隔组装为字符串(间隔像 60 大于 TA 小于 120 是图表中的最后一个,应该是第二个).我将举一个例子,使用五个间隔,每个间隔 60 分钟(TA 是一个数字字段,表示平均时间):

    SELECT INTERVAL, COUNT(*) TOTAL FROM (SELECT CASE WHEN TA>0 AND TA<=60.00 THEN  '0<TA<=60.00' WHEN TA>60.00 AND TA<=120.00 THEN '60.00<TA<=120.00' WHEN TA>120.00 AND TA<=180.00 THEN '120.00<TA<=180.00' WHEN TA>180.00 AND TA<=240.00 THEN '180.00<TA<=240.00' WHEN TA>240.00 THEN '240.00<TA' END   INTERVAL, TA  FROM MP) GROUP BY INTERVAL HAVING INTERVAL IS NOT NULL ORDER BY INTERVAL

我怎样才能正确地显示间隔而不会破坏/损坏我的查询,因为它将根据用户的选择即时组装。

【问题讨论】:

    标签: sql oracle subquery jfreechart intervals


    【解决方案1】:

    如果INTERVAL 列始终以有效数字开头,后跟&lt;,您可以将其第一个值转换为数字进行排序:

    SELECT INTERVAL, COUNT(*) TOTAL
    FROM (
      SELECT
        CASE
          WHEN TA>0 AND TA<=60.00 THEN  '0<TA<=60.00' 
          WHEN TA>60.00 AND TA<=120.00 THEN '60.00<TA<=120.00' 
          WHEN TA>120.00 AND TA<=180.00 THEN '120.00<TA<=180.00' 
          WHEN TA>180.00 AND TA<=240.00 THEN '180.00<TA<=240.00' 
          WHEN TA>240.00 THEN '240.00<TA'
        END INTERVAL,
        TA 
      FROM MP
      )
      WHERE INTERVAL IS NOT NULL
      GROUP BY INTERVAL
      ORDER BY TO_NUMBER(SUBSTR(INTERVAL, 1, INSTR(INTERVAL, '<') - 1));
    

    另外,我将HAVING Interval IS NOT NULL 更改为WHERE Interval IS NOT NULL,因为HAVING 用于COUNT(*) 之类的聚合值,而不是INTERVAL 之类的分组值。


    附录如果间隔数不同,下面的查询可能更适合您。它像上面的查询一样计算间隔文本,但它可以处理任意数量的间隔。第一个CASE 条件处理范围之外的值(n&lt;TA);第二个条件处理范围内的值 (m&lt;TA&lt;=n)。

    我已经指出了您需要为每个查询设置的值。

    SELECT Interval, COUNT(*) FROM (
      SELECT
        TA,
        CASE
          WHEN TA > Parm_IntSize * Parm_IntCount THEN
            TO_CHAR(Parm_IntSize * Parm_IntCount) || '<TA'
          ELSE
            TO_CHAR(TRUNC(TA / Parm_IntSize) * Parm_IntSize)
              || '<='
              || TO_CHAR((TRUNC(TA / Parm_IntSize) + 1) * Parm_IntSize)
          END AS Interval
      FROM MP
      CROSS JOIN (
        SELECT
          60 AS Parm_IntSize,    -- Specify interval size here
          4 AS Parm_IntCount     -- Specify number of intervals here
        FROM DUAL
      ) Parms
    )
    WHERE Interval IS NOT NULL
    GROUP BY Interval
    ORDER BY TO_NUMBER(SUBSTR(Interval, 1, INSTR(Interval, '<') - 1))
    

    【讨论】:

    • Ed Gibbs,表名是 MP(我已编辑,该表是我在组装查询时弄乱的其他项目)。我对您的方法有疑问:我不知道用户有多少间隔数字那个。示例:从 60 分钟开始,间隔数为 10(将​​持续到 540 ......)。有一种方法可以输入:ORDER BY INTERVAL AS NUMERIC ?
    • @LeeP - 好的,我现在明白了一点。我已经编辑了按INTERVAL 的数值排序的答案,而不是为排序创建单独的列。我还添加了一个查询,该查询将根据间隔数和间隔大小进行调整——我以前必须做类似的事情。希望它有所帮助:)
    • Ed Gibbs,我正在尝试您的第一个查询,但我得到的是 ora-00933。请参阅此处:sqlfiddle.com/#!4/d41d8/19307 我在您的查询中看不到错误。
    • 很抱歉 - 我的 WHERE 和 GROUP BY 出现故障。 WHERE 先出现,然后是 GROUP BY。它已在答案中修复。
    • Ed Gibbs,我总是收到 java.sql.SQLSyntaxErrorException: ORA-01722 invalid number in your first query。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2012-09-16
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多