使用游标获取多行并将其数据设置为列
Using cursor for fetching multiple rows and setting its data in columns
我的场景是我必须通过在列 quoteid 和 compid
的基础上对两个 tables A 和 B 执行连接来将数据填充到 table
Table A
------------------------------
quoteid compid ................
10004 1
10004 1
10004 1
10004 22
10004 22
10004 22
Table B
------------------------------------
quoteid compid quartercode cost
10004 1 1q10 14
10004 1 2q09 10
10004 1 3q10 12
10004 22 4q12 32
10004 22 3q11 30
10004 22 2q11 43
现在,select查询的结果应该是
quoteid compid quarter1cost quarter2cost quarter3cost
10004 1 10 14 12
10004 22 43 30 32
select 季度成本的概念是四分之一代码,它是一年中的季度(第一、二...)和年份的最后两位数的组合。因此,最旧的季度将是 quarter1 ,第二个最旧的将是 quarter2 ,最近的将是 quarter3 。在这里,由于加入条件,最近 3 个季度的成本将可用。例如,这里对于 quoteid 10004 和 compid 1,quarter1 将是 2q09,quarter2 将是 1q10,quarter3 将是 3q10,因此成本。
我想用光标来做。但是由于我是新手所以无法得到想要的结果。
TableA好像和你的结果没有关系
基本思路是使用row_number()
和条件聚合。这很复杂,因为你的季度标识符是向后存储的,所以它不能正确排序。但你仍然可以做到:
select quoteid, compid,
max(case when seqnum = 1 then cost end) as cost_q1,
max(case when seqnum = 2 then cost end) as cost_q2,
max(case when seqnum = 3 then cost end) as cost_q3
from (select b.*,
row_number() over (partition by quoteid, compid
order by substr(quartercode, 1, 1), substr(quartercode, 3, 2)
) as seqnum
from b
) b
group by quoteid, compid
我的场景是我必须通过在列 quoteid 和 compid
的基础上对两个 tables A 和 B 执行连接来将数据填充到 table Table A
------------------------------
quoteid compid ................
10004 1
10004 1
10004 1
10004 22
10004 22
10004 22
Table B
------------------------------------
quoteid compid quartercode cost
10004 1 1q10 14
10004 1 2q09 10
10004 1 3q10 12
10004 22 4q12 32
10004 22 3q11 30
10004 22 2q11 43
现在,select查询的结果应该是
quoteid compid quarter1cost quarter2cost quarter3cost
10004 1 10 14 12
10004 22 43 30 32
select 季度成本的概念是四分之一代码,它是一年中的季度(第一、二...)和年份的最后两位数的组合。因此,最旧的季度将是 quarter1 ,第二个最旧的将是 quarter2 ,最近的将是 quarter3 。在这里,由于加入条件,最近 3 个季度的成本将可用。例如,这里对于 quoteid 10004 和 compid 1,quarter1 将是 2q09,quarter2 将是 1q10,quarter3 将是 3q10,因此成本。
我想用光标来做。但是由于我是新手所以无法得到想要的结果。
TableA好像和你的结果没有关系
基本思路是使用row_number()
和条件聚合。这很复杂,因为你的季度标识符是向后存储的,所以它不能正确排序。但你仍然可以做到:
select quoteid, compid,
max(case when seqnum = 1 then cost end) as cost_q1,
max(case when seqnum = 2 then cost end) as cost_q2,
max(case when seqnum = 3 then cost end) as cost_q3
from (select b.*,
row_number() over (partition by quoteid, compid
order by substr(quartercode, 1, 1), substr(quartercode, 3, 2)
) as seqnum
from b
) b
group by quoteid, compid