Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用SQL或PL/SQL水平显示报表_Oracle_Pivot - Fatal编程技术网

Oracle 使用SQL或PL/SQL水平显示报表

Oracle 使用SQL或PL/SQL水平显示报表,oracle,pivot,Oracle,Pivot,我正在开发一个报告,它应该水平显示数据。 必须显示的内容如下: email@1.com 12/09/2013 11/09/2013 10/09/2013 09/09/2013... email@2.com 22/03/2013 21/03/2013 12/02/2013 02/01/2013... 我将这些数据组织在两个表中: 成员和报告 成员表有电子邮件地址,报告表有日期,每封电子邮件可以有许多不同的日期 我可以轻松地垂直检索该信息: SELECT M.EMAIL, R.LAST_OPEN_

我正在开发一个报告,它应该水平显示数据。 必须显示的内容如下:

email@1.com 12/09/2013 11/09/2013 10/09/2013 09/09/2013...
email@2.com 22/03/2013 21/03/2013 12/02/2013 02/01/2013...
我将这些数据组织在两个表中: 成员和报告

成员表有电子邮件地址,报告表有日期,每封电子邮件可以有许多不同的日期

我可以轻松地垂直检索该信息:

SELECT M.EMAIL, R.LAST_OPEN_DATE
FROM MEMBER M, REPORT R
WHERE M.MEMBER_ID = R.MEMBER_ID
AND R.STATUS = 1
AND TRUNC(R.LAST_OPEN_DATE) >= TRUNC(SYSDATE) - 120;
然而水平显示结果是复杂的,有人知道我怎么做吗


我使用的是Oracle 11g。

您可以使用pivot将日期输入到列中:

本质上,这是为每个成员的每个报告日期分配一个数字,然后枢轴基于该排名数字

但是你需要列出每个可能的天数;如果您最多可以有240个报告日期,那么PIVOT IN子句将需要是最多240个的每个数字,即1、2、3、…、239、240中的每个数字,而不仅仅是该小提琴中最多8个数字

如果你曾经有一个会员有超过240个约会,你就看不到其中的一些,所以无论你选择的数字多大,都必须足够高,足以涵盖现在和可预见的未来的所有可能性。由于您的查询限制为120天,即使240天似乎也相当高,但您可能每天有多个查询,在这种情况下,没有真正的上限

您可能需要单独设置每个日期列的格式,但希望您的报告层能够解决这个问题

如果您只想使用每封电子邮件的多个日期执行字符串聚合,您可以在11g中执行此操作:

SELECT M.EMAIL,
  LISTAGG(TO_CHAR(R.LAST_OPEN_DATE, 'DD/MM/YYYY'), ' ')
    WITHIN GROUP (ORDER BY R.LAST_OPEN_DATE DESC)
FROM MEMBER M, REPORT R
WHERE M.MEMBER_ID = R.MEMBER_ID
AND R.STATUS = 1
AND TRUNC(R.LAST_OPEN_DATE) >= TRUNC(SYSDATE) - 120
GROUP BY M.EMAIL;

EMAIL                DATES
-------------------- -------------------------------------------
email@1.com          12/04/2014 11/04/2014 10/04/2014 09/04/2014
email@2.com          12/05/2014 02/04/2014 22/03/2014 21/03/2014


这对于文本报告来说是可以的,但如果此查询被输入到报告工具中则不行。

首先,查询中的列数是预先确定的,不能根据数据进行调整。要克服这一点,您可能会对

但是,在简单的静态情况下,您将需要使用枢轴构造

作为第一步,您需要将行分配给列

select EMAIL, row_number() over (partition by email order by last_date) col
from yourtable
然后添加“魔力轴心”:

<your query>
PIVOT
(
max(last_date)
for col in (1, 2, 3, ..., 240)
)

嘿,伙计们,为了更好地解释,我需要像矩阵一样显示报告,其中每封电子邮件都有不同的日期组织在列中。非常感谢您的帮助。您实际上需要它们作为结果集中的列,或者这纯粹是为了显示/在文件中-所以它们只需要对齐?如果它们必须是单独的列,那么你知道每封电子邮件的日期可能是多少吗?或者可能是120天吗?嗨,谢谢你的帮助,是的,我需要在单独的列中,我计算了一下,知道通过电子邮件给出的最大日期数,每封电子邮件最多是240天。你好,我的朋友,非常感谢你的帮助,脚本运行得很好,我不知道Oracle 11g的这些功能,非常感谢您的帮助。
<your query>
PIVOT
(
max(last_date)
for col in (1, 2, 3, ..., 240)
)