Newsgroup: it.comp.lang.visual-basic
Titolo: Select complessa

Ho un DATABASE msde con la seguente struttura:
due tabelle una di nome DBDISTIN con campo DISTINTA e un'altra DBCOMPON con
campo DISTINTA e COMPONENTE
La select deve prendere il valore DBDISTIN.DISTINTA e metterla in relazione
con DBCOMPON.DISTINTA e quindi estrarre i valori di DBCOMPON.COMPONENTE e
fin qui è tutto ok. I valori estratti devono essere confrontati nuovamente
con DBDISTIN.DISTINTA e per ogni valore che esiste deve essere riconfrontato
con DBCOMPON.DISTINTA e quindi estrarre i valori di DBCOMPON.COMPONENTE
Spero di essere stato chiaro

*robyroby* ha scritto:




Mica tanto, ma pare di capire che vuoi i componenti dei componenti...
Credo che pretenderai di più e andare a oltranza per tutti i possibili
livelli. In tal caso credo che una sola query non basti.
Prova a lavorare su questo (ti confesso che mi son perso solo a vederne i
risultati):
select * from DBCOMPON where COMPONENTE in (Select distinct COMPONENTE from
DBCOMPON where COMPONENTE in (select distinct DISTINTA from DBDISTIN))

Quello che sta chiedendo lui č una soluzione per la gerarchia
padre figlio annidata. Se non error con le funzioni di shape e
similari qualche cosa di utili potresti ricavarci. Ma non ti sň
dire di piů perchč non le ho mai usate.
--
Saluti
Andrea Moro


Io uso questa SP.
Passi l'uniqueidentifier dell'articolo padre, e la quantità da esplodere.
Arriva fino al 4 livello di componenti.
C'è anche un fattore di conversione per questioni legate alle concentrazioni
delle soluzioni, ma tu puoi ometterlo se stai parlando solamente di
assemblaggi a quantità discrete.
Ciao
Alberto
CREATE PROCEDURE Generazione_Consumi_Globali_Singolo_Articolo
 @ID_ART  uniqueidentifier,
 @QTA  real
AS
declare @Secco_Apparente real
set @secco_apparente=
isnull(
(select top 1 valoreparametro
from parametri_dss
where nomeparametro='DENS_SECCO')
,1950.0)
if @secco_apparente<100 or @secco_apparente>3000
 set @secco_apparente=1950
-- Generazione Consumi Applicazione
if object_id('tempdb..#piano_temp_applic_10') is not null
 drop table #piano_temp_applic_10
if object_id('tempdb..#piano_temp_applic_20') is not null
 drop table #piano_temp_applic_20
if object_id('tempdb..#piano_temp_applic_30') is not null
 drop table #piano_temp_applic_30
if object_id('tempdb..#piano_temp_applic_40') is not null
 drop table #piano_temp_applic_40
if object_id('tempdb..#piano_temp_applic_50') is not null
 drop table #piano_temp_applic_50
if object_id('tempdb..#piano_temp_applic_60') is not null
 drop table #piano_temp_applic_60
if object_id('tempdb..#Riepilogo_Applic') is not null
 drop table #Riepilogo_Applic
if object_id('tempdb..#Totali_Applic') is not null
 drop table #Totali_Applic
if object_id('tempdb..##Totali_Applic_Leggibili') is not null
 drop table ##Totali_Applic_Leggibili
if object_id('tempdb..##Albero_Applic_Leggibile') is not null
 drop table ##Albero_Applic_Leggibile
if object_id('tempdb..##Riepilogo_Applic_Leggibile') is not null
 drop table ##Riepilogo_Applic_Leggibile
-- Preparo una tabella riassuntiva di piano e articolo
select @id_art as id_Articolo,
@qta as Quantita_MQ_Totale,
@qta as Quantita_MQ_Residua,
(@qta*ca.pesomq) as Quantita_KG_Totale,
(@qta*ca.pesomq) as Quantita_KG_Residua,
ca.pesomq as Peso_MQ,
ca.id_applicazione as ID_Ricetta
into #piano_temp_applic_10
from catalogo_articoli as ca
where ca.id_applicazione is not null
and ca.id_articolo=@id_art
-- select * from #piano_temp_applic_10
-- Aggiungo gli elementi della ricetta Applicazione
select pt10.*, newid() as ID_Univoco_Liv0,
0 as Livello,
cra.id_atomizzato as ID_Smalto,
cra.percentuale as Percentuale_Smalto,
(pt10.Quantita_MQ_Residua*cra.percentuale/1000)
*
(case
 when cra.densita is null then 1.0
 when cra.densita<100 then 1.0
 when cra.densita>3000 then 1.0
 else
  (cra.densita-1000)/(@secco_apparente-1000)
end)
 as Quantita_KG_Smalto,
coalesce(cra.densita,0.0) as Densita
into #piano_temp_applic_20
from #piano_temp_applic_10 as pt10
inner join catalogo_ricette_articoli as cra
on pt10.id_ricetta=cra.id_ricetta
--select * from #piano_temp_applic_20
-- Aggiungo elementi di livello 1 (atomizzati sotto miscele)
select pt20.*,
rs.id_figlio as ID_Semilavorato_Liv1,
rs.percentuale as Perc_Liv1,
pt20.quantita_kg_smalto*rs.percentuale/100 as Quantita_Kg_Liv1
into #piano_temp_applic_30
from #piano_temp_applic_20 as pt20
left outer join ricette_semilavorati as rs
on pt20.ID_Smalto=rs.id_padre
-- Aggiungo elementi di livello 2 (semilavorato sotto semilavorato)
select pt30.*,
rs.id_figlio as ID_Semilavorato_Liv2,
rs.percentuale as Perc_Liv2,
pt30.quantita_kg_liv1*rs.percentuale/100 as Quantita_Kg_Liv2
into #piano_temp_applic_40
from #piano_temp_applic_30 as pt30
left outer join ricette_semilavorati as rs
on pt30.id_semilavorato_liv1=rs.id_padre
-- Aggiungo elementi di livello 3 (semilavorato sotto semilavorato)
select pt40.*,
rs.id_figlio as ID_Semilavorato_Liv3,
rs.percentuale as Perc_Liv3,
pt40.quantita_kg_liv2*rs.percentuale/100 as Quantita_Kg_Liv3
into #piano_temp_applic_50
from #piano_temp_applic_40 as pt40
left outer join ricette_semilavorati as rs
on pt40.id_semilavorato_liv2=rs.id_padre
-- Aggiungo elementi di livello 4 (semilavorato sotto semilavorato)
select pt50.*,
rs.id_figlio as ID_Semilavorato_Liv4,
rs.percentuale as Perc_Liv4,
pt50.quantita_kg_liv3*rs.percentuale/100 as Quantita_Kg_Liv4
into #piano_temp_applic_60
from #piano_temp_applic_50 as pt50
left outer join ricette_semilavorati as rs
on pt50.id_semilavorato_liv3=rs.id_padre
Update #piano_temp_applic_60
set livello=1
where id_semilavorato_liv1 is not null
Update #piano_temp_applic_60
set livello=2
where id_semilavorato_liv2 is not null
Update #piano_temp_applic_60
set livello=3
where id_semilavorato_liv3 is not null
Update #piano_temp_applic_60
set livello=4
where id_semilavorato_liv4 is not null
-- Tabella riepilogativa ad albero
--select * from #piano_temp_applic_60
--order by Id_Lotto, ID_Miscela, ID_semilavorato_Liv1, ID_semilavorato_Liv2,
ID_semilavorato_Liv3, ID_semilavorato_Liv4
Select id_articolo,
Livello,
id_Smalto as Id_Componente,
quantita_kg_Smalto as Quantita_KG
into #Riepilogo_Applic
from #piano_temp_applic_60
where livello=-1
Insert into #Riepilogo_Applic
Select id_articolo,
Livello,
id_Smalto,
quantita_kg_Smalto
from #piano_temp_applic_60
where livello=0
Insert into #Riepilogo_Applic
Select id_articolo,
Livello,
id_semilavorato_liv1,
quantita_kg_liv1
from #piano_temp_applic_60
where livello=1
Insert into #Riepilogo_Applic
Select id_articolo,
Livello,
id_semilavorato_liv2,
quantita_kg_liv2
from #piano_temp_applic_60
where livello=2
Insert into #Riepilogo_Applic
Select id_articolo,
Livello,
id_semilavorato_liv3,
quantita_kg_liv3
from #piano_temp_applic_60
where livello=3
Insert into #Riepilogo_Applic
Select id_articolo,
Livello,
id_semilavorato_liv4,
quantita_kg_liv4
from #piano_temp_applic_60
where livello=4
-- Tabella con riepilogo monolivello
-- Select * from #Riepilogo_Applic
-- Totalizzazione Quantità
select ID_Componente,
sum(quantita_kg) as Quantita_KG_Totale
into #Totali_Applic
from #Riepilogo_Applic
group by id_componente
-- Estrazioni Riepilogative con valori leggibili
-- Estrazione ad Albero con valori leggibili
select cast(pt60.quantita_mq_residua as real) as Qta_MQ_Prog,
ca.codice as Cod_Articolo,
ca.nome as Nome_Articolo,
ca.descrizione as Descr_Articolo,
cast(pt60.quantita_kg_smalto as real) as Qta_KG_Liv0,
pt60.Densita as 'Densità',
pt60.percentuale_smalto as 'g/mq',
cs0.codice as Codice_Liv0,
cs0.Descr_estesa as Descr_Liv0,
cast(pt60.quantita_kg_liv1 as real) as Qta_KG_Liv1,
cs1.codice as Codice_Liv1,
cs1.Descr_estesa as Descr_Liv1,
cast(pt60.quantita_kg_liv2 as real) as Qta_KG_Liv2,
cs2.codice as Codice_Liv2,
cs2.Descr_estesa as Descr_Liv2,
cast(pt60.quantita_kg_liv3 as real) as Qta_KG_Liv3,
cs3.codice as Codice_Liv3,
cs3.Descr_estesa as Descr_Liv3,
cast(pt60.quantita_kg_liv4 as real) as Qta_KG_Liv4,
cs4.codice as Codice_Liv4,
cs4.Descr_estesa as Descr_Liv4,
pt60.ID_Univoco_Liv0
into ##Albero_Applic_Leggibile
from #piano_temp_applic_60 as pt60
left outer join catalogo_articoli as CA
 on pt60.id_articolo=ca.id_articolo
left outer join catalogo_semilavorati as CS0
 on pt60.id_smalto=CS0.ID_semilavorato
left outer join catalogo_semilavorati as CS1
 on pt60.id_semilavorato_liv1=CS1.ID_semilavorato
left outer join catalogo_semilavorati as CS2
 on pt60.id_semilavorato_liv2=CS2.ID_semilavorato
left outer join catalogo_semilavorati as CS3
 on pt60.id_semilavorato_liv3=CS3.ID_semilavorato
left outer join catalogo_semilavorati as CS4
 on pt60.id_semilavorato_liv4=CS4.ID_semilavorato
order by ID_smalto, ID_semilavorato_Liv1, ID_semilavorato_Liv2,
ID_semilavorato_Liv3, ID_semilavorato_Liv4
-- Estrazione Monolivello con valori leggibili
select ca.codice as Codice_Articolo,
ca.nome as nome_Articolo,
ca.descrizione as Descrizione_Articolo,
RP.livello,
cast(RP.quantita_kg as real) as Quantita_KG_Componente,
CS.descr_breve as Codice_Semilavorato,
CS.Descr_estesa as Descr_Semilavorato
into ##Riepilogo_Applic_Leggibile
from #Riepilogo_Applic as RP
left outer join catalogo_articoli as CA
 on RP.id_articolo=ca.id_articolo
left outer join catalogo_semilavorati as CS
 on RP.ID_COMPONENTE=CS.ID_semilavorato
-- Estrazione Totalizzata con valori leggibili
select cast(TOT.quantita_kg_TOTALE as real) as Quantita_KG_Componente,
CS.descr_breve as Codice_Semilavorato,
CS.Descr_estesa as Descr_Semilavorato
into ##Totali_Applic_LEGGIBILI
from #Totali_Applic as TOT
left outer join catalogo_semilavorati as CS
 on TOT.ID_COMPONENTE=CS.ID_semilavorato
--
E non so se avrò gli amici a farmi il coro,
o se avrò soltanto volti sconosciuti,
canterò le mie canzoni a tutti loro
e alla fine della strada
potrò dire che i miei giorni li ho vissuti...