- Este tópico contém 5 respostas, 2 vozes e foi atualizado pela última vez 18 anos, 8 meses atrás por
gkereki.
-
AutorPosts
-
22 de junho de 2007 às 3:01 am #79813
gkereki
ParticipanteHola, tengo un caso en que hay items simples y complejos. Ej: una bicicleta esta compuesta de 2 ruedas, cada una de las cuales estan compuestas por 28 rayos y 1 aro mismo. Necesitaría poder hacer una consulta que me diga cuangos aros y rayos necesitaría para hacer una bicicleta.
Tengo una tabla:
tarjetas (id_tarjeta, tarjeta)y Tarj_comps (id_tjr_comp, cantidad, articulo, id_tarjeta_padre, id_tarjeta_comp)
Como datos de ejemplo tendria (los articulos simples no irían en las tarjetas, sino directamente en los componentes):
Tarjetas:
1,Bicicleta
2, Manubrio
3, RuedaTARJ_COMPS:
(1,2,,1,3): esto sería que una bicicleta tiene 2 tarjetas de tipo rueda
(2,18,’RAYO’,3,): esto sería que una rueda (tarjeta 3) tiene 18 rayos
(3,1,’ARO’,3,): esto sería que la rueda (tarjeta 3) tiene 1 aro
(4,1,,1,2): esto sería que la bicicleta tiene 1 tarjeta de tipo manubrio. Como les decía antes, necesitaría saber cuánto de cada artículo básico (los tarj_comps que no tienen id_tarjeta_comp) necesito para hacer una bicicleta.
Estuve haciendo algunas pruebas pero no he tenido suerte. He podido sacar el “listado” de anidamiento, pero no multiplicar cada componente por su cantidad (es decir, que si la bicicleta tiene 2 ruedas y cada rueda 18 rayos, necesito 36 rayos en total). ¿Podrán ayudarme?
Gracias y saludos,
Griselda22 de junho de 2007 às 2:01 pm #79814DanielB
Participantea ver si esto te sirve
select sum(a.cantidad), a.id_tjr_comp, t.TARJETA, a.articulo
from
(SELECT ID_TJR_COMP, CANTIDAD, ID_TARJETA_COMP, tc.id_tarjeta_padre, tc.ARTICULO
FROM TARJ_COMPS tc
CONNECT BY PRIOR ID_TARJETA_COMP=ID_TARJETA_PADRE) a, tarjetas t, tarj_comps tc1
where t.ID_TARJETA=a.id_tarjeta_padre
and tc1.ID_TARJETA_COMP=t.ID_TARJETA
group by a.id_tjr_comp, t.TARJETA, a.articulo
order by a.id_tjr_comp22 de junho de 2007 às 3:28 pm #79815DanielB
ParticipanteSORRY LO ANTERIOR NO ESTA BIEN
a ver esta
select articulo_basico.articulo_b, articulo_basico.cantidad * nvl(tc1.cantidad,1)
from (SELECT distinct ID_TJR_COMP, CANTIDAD, ID_TARJETA_COMP, tc.id_tarjeta_padre, tc.ARTICULO,
nvl(t.TARJETA, articulo) articulo_b
FROM TARJ_COMPS tc
, tarjetas t
where t.ID_TARJETA(+)=tc.ID_TARJETA_comp
CONNECT BY PRIOR ID_TARJETA_comp=id_tarjeta_padre) articulo_basico, tarj_comps tc1
where articulo_basico.ID_TARJETA_PADRE=tc1.ID_TARJETA_COMP(+)aqui el unico tema es que no debiera haber tarjetas que tengan como tarjeta_comps otra tarjeta, excepto el principal(en el ejemplo la bicicleta)
y a su vez todo elemento que lleve valor en articulo no debe tener hijos en tarj_compssaludos
22 de junho de 2007 às 3:40 pm #79817DanielB
Participantesolamente los articulos sin id_tarjeta_comp
select articulo_basico.articulo_b, articulo_basico.cantidad * nvl(tc1.cantidad,1), articulo_basico.id_tarjeta_comp
from (SELECT distinct ID_TJR_COMP, CANTIDAD, ID_TARJETA_COMP, tc.id_tarjeta_padre, tc.ARTICULO,
nvl(t.TARJETA, articulo) articulo_b
FROM TARJ_COMPS tc
, tarjetas t
where t.ID_TARJETA(+)=tc.ID_TARJETA_comp
CONNECT BY PRIOR ID_TARJETA_comp=id_tarjeta_padre) articulo_basico, tarj_comps tc1
where articulo_basico.ID_TARJETA_PADRE=tc1.ID_TARJETA_COMP(+)
and articulo_basico.id_tarjeta_comp IS NULL22 de junho de 2007 às 6:59 pm #79825gkereki
ParticipanteHi, primero que nada GRACIAS!
Estuve probando y el problema es que el mismo componente podría ser usado en más de una tarjeta. Es decir, volviendo al ejemplo de la bicicleta, si luego tuviera también “bicicleta de niño” que tiene 2 ruedas, 1 manubrio y 1 bocina de superman, al hacer el conteo, traería 4 ruedas, 2 manubrios, 1 bocina …
¿Me explico?
Esta complicado …… de alguna manera habría que poder restringir a que arranque a partir de una cierta tarjeta (de ahí para abajo) de forma tal de no considerar las otras …
Yo hice la prueba poniendo esto:
select articulo_b, sum( cantidad)
from (
select articulo_basico.articulo_b,
articulo_basico.cantidad * nvl(tc1.cantidad,1) cantidad,
articulo_basico.id_tarjeta_comp
from (SELECT distinct ID_TRj_COMP,
CANTIDAD,
ID_TARJETA_COMP,
tc.id_tarjeta_padre,
tc.ARTICULO,
nvl(t.TARJETA, articulo) articulo_b
FROM TARJ_COMPS tc
, tarjetas t
where t.ID_TARJETA(+)=tc.ID_TARJETA_comp
start with id_tarjeta_padre=89
CONNECT BY PRIOR ID_TARJETA_comp=id_tarjeta_padre) articulo_basico,
tarj_comps tc1
where articulo_basico.ID_TARJETA_PADRE=tc1.ID_TARJETA_COMP(+)
and articulo_basico.id_tarjeta_comp IS NULL)
group by articulo_bY me trajo de más …
Te cuento los datos que tengo:
Tarjeta 90:
articulo A, 7 unidades
B: 5 unids
C: 3 unidsTarjeta 1:
A, 1 unidad
D, 1 unidadTarjeta 89:
Tarjeta 1, 1 unidad
Tarjeta 90, 3 unidades
articulo E, 3 unidades
articulo F, 2 unids
articulo C, 7 unidsEl resumen de artículos de la tarjeta 89 debería ser:
A, 22 unidades
B, 15
C, 16
D, 1
E, 3
F, 2Sin embargo me da:
A, 53
B, 35
C, 28
D, 4
E, 3
F, 2Supongo que eso es porque la misma tarjeta 1, por ejemplo, está usada en otras tarjetas también …
Gracias,
22 de junho de 2007 às 10:48 pm #79839gkereki
ParticipanteYA LE ENCONTRE LA VUELTA!!!
Con el prior cant se puede obtener la cantidad de la tarjeta padre y con eso multiplicar a los hijos ….
select id_tarjeta, articulo, sum(cant_mult) cantidad
from (
select sys_connect_by_path(t.id_tarjeta_padre,’/’) path,
substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2,
decode(instr( substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2),’/’),
0,length(substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2))+1,
instr( substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2),’/’)-1)) id_tarjeta,
instr( substr(sys_connect_by_path(t.id_tarjeta_padre,’/’),2),’/’) in_str,
t.id_trj_comp,
articulo,
cantidad cant_lin,
id_tarjeta_comp,
id_tarjeta_padre,
nvl(prior cantidad,1)* cantidad cant_mult
from tarj_comps t
–start with id_tarjeta_padre=117
connect by prior id_tarjeta_comp = id_tarjeta_padre)
where articulo is not null
group by id_tarjeta, articuloGracias!!!
Griselda -
AutorPosts
- Você deve fazer login para responder a este tópico.