在ORACLE10G中,遇到的一个动态增加列的问题。请各位高手帮忙看看,不胜感激。
现在的查询结果如下:
JH JH_ID ACC_JH AAC_ID
A A1 B B3
A A2 B B4
A A4 B B5
A A2 C C2
A A5 C C3
A A7 C C4希望的结果如下:
JH JH_ID ACC_JH AAC_ID ACC_JH1 AAC_ID2
A A1 B B3 C 0
A A2 B B4 C C2
A A3 B B5 C 0
A A4 B 0 C 0
A A5 B 0 C C3
A A6 B 0 C 0
A A7 B 0 C C4JH 列中,对于每一个元素(例如A),在ACC_JH列中,都有多个元素对应(例如B和C)。
现在希望:
ACC_JH列中对应A有几个元素,表的右边就有几列对应。如上图,B和C 2个元素对应A,则上表右边有2列ACC_JH 和 ACC_JH1 。请问大家有什么好的方法可以解决?
现在的查询结果如下:
JH JH_ID ACC_JH AAC_ID
A A1 B B3
A A2 B B4
A A4 B B5
A A2 C C2
A A5 C C3
A A7 C C4希望的结果如下:
JH JH_ID ACC_JH AAC_ID ACC_JH1 AAC_ID2
A A1 B B3 C 0
A A2 B B4 C C2
A A3 B B5 C 0
A A4 B 0 C 0
A A5 B 0 C C3
A A6 B 0 C 0
A A7 B 0 C C4JH 列中,对于每一个元素(例如A),在ACC_JH列中,都有多个元素对应(例如B和C)。
现在希望:
ACC_JH列中对应A有几个元素,表的右边就有几列对应。如上图,B和C 2个元素对应A,则上表右边有2列ACC_JH 和 ACC_JH1 。请问大家有什么好的方法可以解决?
解决方案 »
- 未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0
- 问一个Group By查询的问题!
- 怎样提高 _RecordsetPtr::MoveNext()的速度?
- 如何处理两边都是动态查询
- 请教一个多表关联的sql构造
- TNSPING不通,但LISTENER配置是对的,请进
- ORACLE有没有数组型字段,比如WORD[1000],若有怎么使用,若无怎么实现,请详细指教,分不够可另开帖再加,谢谢!
- 急:restricted data type attribute violation
- ORACLE升级问题
- 我从Oracle Enterprise Manager登录时,对话框中的Service填什么内容?多谢!
- 请教各位大侠oracle 9i 可不可以生成类似awr的报告啊?非常感谢
- 请好心人解决一下Oracle中的关系代数问题!!!
with temp as
(
select 'A' a,'A1' b,'B' c,'B3' d from dual
union all
select 'A' ,'A2','B','B4' from dual
union all
select 'A','A3','B','B5' from dual
union all
select 'A','A4','C','C2' from dual
union all
select 'A','A5','C','C3' from dual
union all
select 'A','A6','C','C4' from dual
)
select
case when substr(b,1,1)='A' and length(b)=2 then a else 'A' end,
case when substr(b,1,1)='A' and length(b)=2 then b end,
case when substr(c,1,1)='B' and length(c)=1 then c else 'B' end,
case when substr(d,1,1)='B' and length(d)=2 then d end,
case when substr(c,1,1)='C' and length(c)=1 then c else 'C' end,
case when substr(d,1,1)='C' and length(d)=2 then d end
from temp
2 (
3 select 'A' a,'A1' b,'B' c,'B3' d from dual
4 union all
5 select 'A' ,'A2','B','B4' from dual
6 union all
7 select 'A','A3','B','B5' from dual
8 union all
9 select 'A','A4','C','C2' from dual
10 union all
11 select 'A','A5','C','C3' from dual
12 union all
13 select 'A','A6','C','C4' from dual
14 union all
15 select 'A' ,'A2','C','C2' from dual
16 union all
17 select 'A' ,'A4','B','B4' from dual
18 )
19 select a, b, 'B' c,nvl(max(decode(c, 'B', d)),'0') d,'C' e, nvl(max(decode
(c, 'C', d)),'0') f from temp group by a, b order by a, b asc;A B C D E F
- -- - -- - --
A A1 B B3 C 0
A A2 B B4 C C2
A A3 B B5 C 0
A A4 B B4 C C2
A A5 B 0 C C3
A A6 B 0 C C4已选择6行。
select a.jh,a.jh_id,nvl(b.acc_jh,'B')acc_jh,
nvl(b.aac_id,0)aac_id,nvl(c.acc_jh,'C')acc_jh1,
nvl(c.aac_id,0)aac_id1 from(
select 'A' jh,'A'||rownum Jh_id from dual
connect by rownum<=(select substr(max(jh_id),2) from test_o))a
left join (select * from test_o where acc_jh='B')b
on a.jh_id=b.jh_id
left join (select * from test_o where acc_jh='C')c
on a.jh_id=c.jh_id
order by a.jh_id ;或
select a.jh,a.jh_id,'B' acc_jh,
max(decode(b.acc_jh,'B',b.aac_id,0))aac_id,
'C' acc_jh1,
max(decode(b.acc_jh,'C',b.aac_id,0))aac_id1 from(
select 'A' jh,'A'||rownum Jh_id from dual
connect by rownum<=(select substr(max(jh_id),2) from test_o))a
left join test_o b
on a.jh_id=b.jh_id
group by a.jh,a.jh_id
order by a.jh_id ;
--原表
JH JH_ID ACC_JH AAC_ID
A A1 B B3
A A2 B B4
A A4 B B5
A A2 C C2
A A5 C C3
A A7 C C4
--结果
JH JH_ID ACC_JH AAC_ID ACC_JH1 AAC_ID1
A A1 B B3 C 0
A A2 B B4 C C2
A A3 B 0 C 0
A A4 B B5 C 0
A A5 B 0 C C3
A A6 B 0 C 0
A A7 B 0 C C4
小弟ORACLE菜鸟,对你们给的sql有点疑问。
各位的sql中都硬编码了表中的字段具体内容,例如 ‘A'、‘B’、‘C’ 等等。
但是,实际情况中字段内容是随时改变的啊。还请大家不胜赐教。
实际上,我现在的表是2个表关联的查询结果。
select A.JH, A.LTCH , B.RIGHT_DBJH, B.RIGHT_LICH from A , B
where A. LTCH = B.RIGHT_LICH JH LTCH RIGHT_DBJH RIGHT_LTCH
8B102 21 8B11 21
8B102 3 8B11 22
8B102 42-51 8B11 42-51
8B102 21 8B16 21
8B102 41*1 8B16 22
8B102 42-51 8B16 3
9C100 9 9C10 11
9C100 10 9C10 10但是实际的需求的表格式如下:JH LTCH RIGHT_DBJH RIGHT_LTCH RIGHT_DBJH2 RIGHT_LTCH2
8B102 21 8B11 21 8B16 21
8B103 3 8B11 22 8B16 0
8B104 42-51 8B11 42-51 8B16 3
8B105 41*1 8B16 22 8B16 0
9C100 9 9C10 11 0
9C100 10 9C10 10 0JH列中,对于每个字段元素(例如8B102),在RIGHT_LTCH列中,都有多个元素对应(例如8B11和8B16)。JH列中可能存在几百个不同的元素,而在RIGHT_LICH中,又可能存在几十个元素与之对应。
这也意味着表的右边可能有几十列(动态扩展)。看完大家的sql后,发现很多‘A’、‘B’、‘C’。我理解是JH 和 ACC_JH 中字段内容。
但是这里的内容都是变化的啊。 JH 和 ACC_JH 都是有分组关系的啊。还请大家解答小弟困惑。
max(decode(b.acc_jh,'B',b.aac_id,0))aac_id,
'C' acc_jh1,
max(decode(b.acc_jh,'C',b.aac_id,0))aac_id1 from(
select 'A' jh,'A'||rownum Jh_id from dual
connect by rownum<=(select substr(max(jh_id),2) from test_o))a
left join test_o b
on a.jh_id=b.jh_id
group by a.jh,a.jh_id
order by a.jh_id ;狂浪兄弟,我按照你的代码测试。在 max(decode(b.acc_jh,'B',b.aac_id0))aac_id 的b.acc_id 提示“标识符无效”的错误。
你表名换过来了吗?
test_o是我测试用的表
如果还提示的话你检查下字段名是否书写正确
还有你说可能有几十列的问题,再怎么简化你都得写几十个表名
如果字段数不确定,要么你多写几列,没有的全置0,要么试试用Pl/sql
'A','B'这些可以从表中提取,改下代码就好了,就是比较繁琐
如果是这样,表中字段内容随时都改变的啊。。
上面的代码没有做到这点,可以修改以达到这个目的
原表中第一列的值固定不变,第三列的可以用分析函数row_number确定序号
再在case中以这个序号代替'B','C'等