【问题标题】:Crosstab with static column带有静态列的交叉表
【发布时间】:2016-01-11 01:22:31
【问题描述】:

如何在交叉表中创建静态列/行?见下面的例子;我可以有一个固定的 jan、feb、march、... 列而不是动态生成吗?

location       jan   feb   mar   apr   may   jun   jul   aug   sep   oct   nov   dec 
london         500   62    200   50    0     60    100   46    89    200   150   210
paris          50    26    20    500   50    70    40    200   0     40    250   50

我希望列 (jan, feb, mar, apr, ...) 始终显示,无论它们的度量值是零还是有值。就像它们是固定的一样。

这是我正在使用的查询:

select sum("AMOUNT"), "REQUESTDATE","description" 
from(
SELECT SUM(e.AMOUNT)"AMOUNT",TO_CHAR(REQUESTDATE,'MM')"REQUESTDATE", CA.DESCR "description"
FROM PC_PAYMENTTRXNLOG PC,GLB_TYPE ca, PC_ESERVICEINQUIRY e
where PC.ESERVICE_ID = E.ID 
AND trunc(REQUESTDATE) between trunc(to_date('2012-01-01','yyyy-mm-dd')) and trunc(to_date('2012-06-30','yyyy-mm-dd'))
GROUP BY TO_CHAR(REQUESTDATE,'MM'),CA.DESCR 
 )
group by "REQUESTDATE","description"

和输出

    SUM("amount") Requestdate    Description
    2550405         04           A
    2550405         04           B
    23893281        05           C
    614977          06           A
    614977          06           E
    2550405         04           C

现在将查询更新为

  select sum("AMOUNT"), month,"description" 
  from(
  SELECT SUM(e.AMOUNT)"AMOUNT",TO_CHAR(REQUESTDATE,'MM')"REQUESTDATE", CA.DESCR "description"
  FROM PC_PAYMENTTRXNLOG PC,GLB_TYPE ca, PC_ESERVICEINQUIRY e
  where PC.ESERVICE_ID = E.ID 
  AND trunc(REQUESTDATE) between trunc(to_date('2012-01-01','yyyy-mm-dd')) and trunc(to_date('2012-06-30','yyyy-mm-dd'))
  GROUP BY TO_CHAR(REQUESTDATE,'MM'),CA.DESCR 
   ) 
 full outer join (select to_char(date '1970-01-01'
+ numtoyminterval(level - 1, 'month'), 'mm') as month
  from dual
  connect by level <= 12) on month="REQUESTDATE"
  group by month,"description"

当运行查询时,它会显示所有月份,无论它们的度量是零还是有值。

但是现在的输出是这样的

location       jan   feb   mar   apr   may   jun   jul   aug   sep   oct   nov   dec 
london         500   62    200   50    0     60    100   46    89    200   150   210
paris          50    26    20    500   50    70    40    200   0     40    250   50
null            0     0     0     0     0     0     0     0    0      0     0     0

如何限制/隐藏最后一个空行?

【问题讨论】:

  • 在查询本身.. 使用完全外连接和月份。简单
  • 你能解释一下吗?
  • 你过得怎么样?包括示例查询或附加 sqlfiddle
  • 我的查询select count("NUMBER OF RECEIPT"), sum("AMOUNT"), "REQUESTDATE","description" from (SELECT PC.ID "NUMBER OF RECEIPT", SUM(e.AMOUNT) "AMOUNT", TO_CHAR(REQUEST_TIMESTAMP, 'MM') "REQUESTDATE",CA.DESCR "description" FROM PC_PAYMENTTRXNLOG PC,GLB_TYPE ca, PC_ESERVICEINQUIRY e, where PC.ESERVICE_ID = E.ID AND ca.ID=E.CARDTYPE AND trunc(REQUESTDATE) between trunc(to_date('2012-01-01','yyyy-mm-dd')) and trunc(to_date('2012-06-30','yyyy-mm-dd')) GROUP BY TO_CHAR(REQUEST_TIMESTAMP, 'MM'), PC.ID,CA.DESCR ) group by "REQUESTDATE","description" 月份显示如requestdate 06 06 05 05 04 04
  • 编辑并将其添加到您的问题中,并添加您正在使用的数据库的标签。和示例 sql 输出或 sqlfiddle。请更清楚。并且永远记住在选择查询中使用别名然后获取记录。

标签: sql oracle jasper-reports crosstab


【解决方案1】:

没有测试过..但是试试这样的

select sum("AMOUNT"), month,"description" 
from(SELECT SUM(e.AMOUNT)"AMOUNT",TO_CHAR(REQUESTDATE,'MM')"REQUESTDATE", CA.DESCR "description"
FROM PC_PAYMENTTRXNLOG PC,GLB_TYPE ca, PC_ESERVICEINQUIRY e
where PC.ESERVICE_ID = E.ID 
AND trunc(REQUESTDATE) between trunc(to_date('2012-01-01','yyyy-mm-dd')) and trunc(to_date('2012-06-30','yyyy-mm-dd'))
GROUP BY TO_CHAR(REQUESTDATE,'MM'),CA.DESCR 
 ) 
full outer join (select to_char(date '1970-01-01'
+ numtoyminterval(level - 1, 'month'), 'mm') as month
from dual
connect by level <= 12) on month="REQUESTDATE"
group by month,"description"

点击这里查看SQL Fiddle在Oracle中生成1到12的演示

一旦你生成了这个.. full external join 你的主查询和这个系列查询,并从系列查询中取一个月,就像我在主查询中所做的那样。

使用此查询,您将获得所有月份的所有数据,其中包含 null 值。

对于Description 列 - iReport 将属性的 isRemoveLineWhenBlank 和 isBlankWhenNull 设置为 True,这将删除 iReport 中打印的空值

对于Measure,以这样的方式使用Print when expression,当描述为空时返回false。所以这将阻止值0 在 iReport 中打印。

【讨论】:

  • 我试过而不是select to_char(date '1970-01-01' + numtoyminterval(level - 1, 'month'), 'mm') as month from dual connect by level &lt;= 12 这个SELECT to_char(to_date( level,'mm'), 'mm') as month FROM DUAL CONNECT BY LEVEL &lt;=12 但仍然得到同样的错误。
  • @Omorak_Taybeh 我添加了 sql fiddle,因为你在你的问题中标记了 oracle db。
  • 当我将生成那几个月的查询与主查询一起放置时,我得到 SQL 命令未正确结束错误。
  • 我找到了导致错误的原因!两个表的名称(a,m),通过删除它们,查询将成功运行! :) 但结果显示一个新的空行!我怎样才能隐藏这一行?
  • @Omorak_Taybeh 请用你所做的小改动编辑答案。你可以再次更新问题吗?有更清晰的代码?
猜你喜欢
  • 2018-11-01
  • 2021-12-23
  • 2012-09-07
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2019-05-13
相关资源
最近更新 更多