Java 如何在iReport中使用SQL查询同一项目的多个和

Java 如何在iReport中使用SQL查询同一项目的多个和,java,sql,jasper-reports,ireport,Java,Sql,Jasper Reports,Ireport,我正在使用iReport创建一个JasperReport,因此,我仅限于一个SQL查询 我有一个“statistics”表,其中有“name”(VARCHAR)、“count”(INTEGER)和“datetime”(datetime)列 当“name”是最后一天的“test”时,得到“count”列的和就足够简单了,同样,在最后一周和月份也是如此(见下文) 工作SQL语句: SELECT SUM(count)as 'today' FROM statistics WHERE n

我正在使用iReport创建一个JasperReport,因此,我仅限于一个SQL查询

  • 我有一个“statistics”表,其中有“name”(VARCHAR)、“count”(INTEGER)和“datetime”(datetime)列

  • 当“name”是最后一天的“test”时,得到“count”列的和就足够简单了,同样,在最后一周和月份也是如此(见下文)

  • 工作SQL语句:

    
    SELECT
      SUM(count)as 'today'
    FROM
      statistics
    WHERE
       name = "test"
      AND $P{oneDayAgo} <= datetime
      AND datetime <= $P{now}
    
    
    挑选
    总计(计)为“今天”
    从…起
    统计数字
    哪里
    name=“测试”
    
    和$P{oneDayAgo}

    联合查询应该生成相同的列(名称、类型)。将未使用的列设置为NULL或使用差异列:

    SELECT
         SUM(count) as `total`,
         'today' as `when`
    FROM
         statistics
    WHERE
         name = "test"
     AND $P{oneDayAgo} <= datetime
     AND datetime <= $P{now}
    UNION
    SELECT
         SUM(count) as `total`,
         'thisWeek' as `when`
    FROM
         statistics
    WHERE
         name = "test"
     AND $P{oneWeekAgo} <= datetime
     AND datetime <= $P{now}
    UNION
    SELECT
         SUM(count) as `total`,
         'thisMonth' as `when`
    FROM
         statistics
    WHERE
         name = "test"
     AND $P{oneMonthAgo} <= datetime
     AND datetime <= $P{now}
    
    选择
    总计,
    “今天”作为“什么时候”`
    从…起
    统计数字
    哪里
    name=“测试”
    
    和$P{oneDayAgo}

    联合查询应该生成相同的列(名称、类型)。将未使用的列设置为NULL或使用差异列:

    SELECT
         SUM(count) as `total`,
         'today' as `when`
    FROM
         statistics
    WHERE
         name = "test"
     AND $P{oneDayAgo} <= datetime
     AND datetime <= $P{now}
    UNION
    SELECT
         SUM(count) as `total`,
         'thisWeek' as `when`
    FROM
         statistics
    WHERE
         name = "test"
     AND $P{oneWeekAgo} <= datetime
     AND datetime <= $P{now}
    UNION
    SELECT
         SUM(count) as `total`,
         'thisMonth' as `when`
    FROM
         statistics
    WHERE
         name = "test"
     AND $P{oneMonthAgo} <= datetime
     AND datetime <= $P{now}
    
    选择
    总计,
    “今天”作为“什么时候”`
    从…起
    统计数字
    哪里
    name=“测试”
    和$P{oneDayAgo}

    sum(case-when-condition-then count else 0 end)

    选择
    SUM(case when$P{oneDayAgo}

    SUM(case when-condition-then count else 0 end)

    选择
    SUM(如果$P{oneDayAgo}

    您有两个选项:

    1) 删除每个查询的“as”部分,然后它将作为一个没有名称的列出现

    2) 创建临时表并将这些行插入临时表,然后查询临时表。您有两个选项:

    1) 删除每个查询的“as”部分,然后它将作为一个没有名称的列出现


    2) 创建一个临时表并将这些行插入临时表,然后查询临时表

    ,那么如何区分“日”、“周”和“月”行?您还可以使用CASE/WHEN来计算“WHEN”列,而不是UNION。此解决方案将为您提供3行2列(3“总计”和3“何时”)。Hafthor's将为您提供一行3列,可能更好。那么如何区分“日”和“周”以及“月”行?您还可以使用CASE/WHEN来计算“何时”列,而不是UNION。此解决方案将为您提供3行2列(3“总计”和3“何时”)。Hafthor's会给你一行3列,也许更好。如果你发布你想要的输出的表定义和示例,我相信有人能帮你…如果你发布你想要的输出的表定义和示例,我相信有人能帮你…$P{}-这是Jasper的魔法吗,或者是我以前从未见过的SQL语言的某些部分?$P{}就是Jasper magic!(只是报告中指定的一个参数)很酷,谢谢Haftor,我不知道这是“更快”还是“更好”,但它确实更干净更清晰。$P{}-这是Jasper magic,还是我以前从未见过的SQL语言的某个部分?$P{}是Jasper magic!(只是报告中指定的一个参数)很酷,谢谢Hafthor,我不知道这是“更快”还是“更好”,但它肯定是越来越清晰了。
    SELECT
      SUM(case when $P{oneDayAgo} <= datetime then count else 0 end) as 'today',
      SUM(case when $P{oneWeekAgo} <= datetime then count else 0 end) as 'thisweek',
      SUM(count) as 'thismonth'
    FROM
      statistics
    WHERE
       name = "test"
      AND $P{oneMonthAgo} <= datetime
      AND datetime <= $P{now}