SQL查询以平面格式返回历史记录

时间:2017-01-17 15:29:58

标签: sql oracle

寻求SQL查询的帮助,将历史表转换为平面文件格式,在表B上最多包含5个结果实例。我在结果中只显示了2个实例。对于奖励积分,可以按EFF_DATE升序排序吗?!

enter image description here

到目前为止,我的查询是

SELECT a.REFNO, a.M_NAME, b.EFF_DATE, b.VAL
FROM TABLEA a INNER JOIN TABLEB b ON (a.REFNO=b.REFNO)
WHERE a.REFNO = '1'

这适用于每行返回一次结果,但是如何修改最多5个EFF_DATE并且VAL实例在一行上重复。日期可以是任何日期,理想情况下,它们希望从左到右排序。只有TABLEB上的那些行,其中Val>应该包括0。

1 个答案:

答案 0 :(得分:1)

如果您知道历史记录中所需的列数,则可以使用条件聚合或pivot。挑战是没有枢轴列。

但是,您可以使用ROW_NUMBER()

轻松生成一个
SELECT a.REFNO, a.M_NAME,
       MAX(CASE WHEN seqnum = 1 THEN b.EFF_DATE END) as EFF_DATE_1,
       MAX(CASE WHEN seqnum = 1 THEN b.VAL END) as VAL_1,
       MAX(CASE WHEN seqnum = 2 THEN b.EFF_DATE END) as EFF_DATE_2,
       MAX(CASE WHEN seqnum = 2 THEN b.VAL END) as VAL_2,
       MAX(CASE WHEN seqnum = 3 THEN b.EFF_DATE END) as EFF_DATE_3,
       MAX(CASE WHEN seqnum = 3 THEN b.VAL END) as VAL_3
FROM TABLEA a INNER JOIN
     (SELECT b.*,
             ROW_NUMBER() OVER (PARTITION BY REFNO ORDER BY EFF_DATE) as seqnum
      FROM TABLEB b
     ) b
     ON a.REFNO = b.REFNO
WHERE a.REFNO = '1'
GROUP BY a.REFNO, a.M_NAME;

如果您不知道输出中的列数,那么您将需要动态SQL或在应用程序层进行格式化。