寻求SQL查询的帮助,将历史表转换为平面文件格式,在表B上最多包含5个结果实例。我在结果中只显示了2个实例。对于奖励积分,可以按EFF_DATE升序排序吗?!
到目前为止,我的查询是
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。
答案 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或在应用程序层进行格式化。