Newsgroup: it.comp.software.database
Titolo: query conteggio molto complessa

mi scuso se per questa volta metto il testo della presente in allegato
ma le tabelle altrimenti sono illeggibili
Ho un elenco chiamato merceologico che riporta per ogni codice azienda
i tre livelli merceologici come ad esempio:
CUSTOMER_ID	INTEREST_TYPE_ITA	    INTEREST_P_CODE_ITA
INTEREST_S_CODE_ITA
1092	 D_TELECOMUNICAZIONI E NETWORKING	Cablaggio
Apparecchiature a fibra ottica
1092	 D_TELECOMUNICAZIONI E NETWORKING	Cablaggio
Apparecchiature di trasmissione
1092	 D_TELECOMUNICAZIONI E NETWORKING	Cablaggio 	Reti
wireless
1092	 D_TELECOMUNICAZIONI E NETWORKING	Cablaggio
Servizi di rete:
1092	 D_TELECOMUNICAZIONI E NETWORKING	Cablaggio
Sistemi per controllo dell'accesso alla rete e all'applicazione
1092	 D_TELECOMUNICAZIONI E NETWORKING	Network computing
Adapter
18859	 A_HARDWARE E COMPLEMENTI	                Monitor,
periferiche, schede e implementazione	Schede:
18875	 A_HARDWARE E COMPLEMENTI	                Sistemi di
identificazione, sicurezza elettronica, smart card	
18870	 A_HARDWARE E COMPLEMENTI	                Sistemi di
identificazione, sicurezza elettronica, smart card	
18869	 A_HARDWARE E COMPLEMENTI           	Monitor, periferiche,
schede e implementazione	Schermi (monitor):
ovviamente un'azienda (=customer_id) puo' comparire in piu' righe
perche' ha definite piu' categorie merceologiche.
Quindi nella tabella sopra ho:
azienda,merceologia primo livello, secondo livello, terzo livello
Poi ho una tabella che per ogni tripletta merceologica definisce un
macro gruppo di appartenenza ad esempio:
ID	ORDINE	INTEREST_TYPE	PRIMARY	SECONDARY
SECONDARY INTEREST TYPE
GRUPPO BANCA?          GRUPPO DOMOTICA?    GRUPPO UFFICIO?
150	150	 B_SOFTWARE	Soluzioni e software per banche e
assicurazioni	              NULL
SI                                         NO
NO
151	151	 B_SOFTWARE	Soluzioni e software per banche e
assicurazioni	Software applicativo per banche, finanza e
assicurazioni:	                    SI
NO                            NO
9	9	 A_HARDWARE E COMPLEMENTI	Apparati multimediali
per l'ufficio	Altre apparecchiature per la comunicazione
audio-visiva          NO                                      NO
SI
10	10	 A_HARDWARE E COMPLEMENTI	Apparati multimediali
per l'ufficio	Altri materiali ausiliari per l'EDP
NO                                     NO
NO
Quindi nella tabella sopra ho:
tripletta merceologica e indicazione di appartenenza ad un certo macro
insieme.
I macroinsiemi sono ad esempio: applicazioni bancarie, sw per il
commercio, sicurezza, svago....
L'appartenenza o meno delle merceologie ad un'insieme cioe' il
popolamento dei SI e dei NO lo faccio fare ad una segretaria tramite
un modulo access in cui deve spuntare dei checkbox.
QUELLO CHE NON RIESCO A FARE E'...
una query che mi riporta il numero totale di aziende che appartengono
ad un gruppo cioe' 
GRUPPOBANCA GRUPPODOMOTICA ....
 10aziende                 5aziende
Forse devo usare il count distinct ?
Ho provato a fare una query di questo tipo ma non conta in modo
corretto.
CREATE OR REPLACE FORCE VIEW NOMESCHEMA.PROVA
(CONTA1)
AS 
SELECT 
(select  count(  mer.customer_id)  
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE (    (mer.interest_type_ita = MAP.interest_type)
        AND (mer.interest_p_code_ita = MAP.PRIMARY)
        AND (mer.interest_s_code_ita = MAP.secondary)
		and (map.attrubute1 = 'SI')
       )
 ) as conta1  FROM mappatura_interest_type MAP, merceologico mer;
Mi aiutate ?
Avete qualche idea su come farla in un'altro modo ?
Se volete metto da qualche parte le tabelle access cosi' vi e' piu'
chiaro.
Ciao
Albe






SELECT  count(*) from
(select  mer.customer_id
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE mer.interest_type_ita = MAP.interest_type
        AND mer.interest_p_code_ita = MAP.PRIMARY
        AND mer.interest_s_code_ita = MAP.secondary
        and map.[GRUPPO BANCA?] = 'SI'
  GROUP BY mer.customer_id)
 )
Dovrebbe tirati fuori tutte le aziende che fanno parte del GRUPPO_BANCA.
L'ho scritta senza provarla.
Nel caso non andasse...dimmi dove posso trocare le tabelle.
Ciao
Alex

funziona ! ma i miei attributi sono 30 quindi la cosa diventa molto
pesante. L'ho fatta con toad, ora provo a vedere access come lavora e
poi controllo i tempi di esecuzione su tabelle statiche al posto delle
viste che uso adesso.
La vista impiega 18 secondi (server ibm aix), tenete conto che mer(e'
una vista che impiega 1 secondo)  ha 26000 righe e map(tabella
statica) ha 380 righe
Se qualcuno ha qualche idea...
con cinque attributi il codice che uso e':
SELECT 
(
SELECT  count(*) from
(select  mer.customer_id
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE mer.interest_type_ita = MAP.interest_type
        AND mer.interest_p_code_ita = MAP.PRIMARY
        AND mer.interest_s_code_ita = MAP.secondary
        and map.attrubute1 = '-1'
  GROUP BY mer.customer_id)
 ) as conta1	,   	 
(SELECT  count(*) from
(select  mer.customer_id
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE mer.interest_type_ita = MAP.interest_type
        AND mer.interest_p_code_ita = MAP.PRIMARY
        AND mer.interest_s_code_ita = MAP.secondary
        and map.attrubute2 = '-1'
  GROUP BY mer.customer_id)
 ) as conta2	,
 (SELECT  count(*) from
(select  mer.customer_id
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE mer.interest_type_ita = MAP.interest_type
        AND mer.interest_p_code_ita = MAP.PRIMARY
        AND mer.interest_s_code_ita = MAP.secondary
        and map.attrubute3 = '-1'
  GROUP BY mer.customer_id)
 ) as conta3	 ,
 (SELECT  count(*) from
(select  mer.customer_id
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE mer.interest_type_ita = MAP.interest_type
        AND mer.interest_p_code_ita = MAP.PRIMARY
        AND mer.interest_s_code_ita = MAP.secondary
        and map.attrubute4 = '-1'
  GROUP BY mer.customer_id)
 ) as conta4	  	 ,
 (SELECT  count(*) from
(select  mer.customer_id
 FROM mappatura_interest_type MAP, merceologico mer
 WHERE mer.interest_type_ita = MAP.interest_type
        AND mer.interest_p_code_ita = MAP.PRIMARY
        AND mer.interest_s_code_ita = MAP.secondary
        and map.attrubute5 = '-1'
  GROUP BY mer.customer_id)
 ) as conta5	


considera anche che caricando "-1" come infomarmazione io posso anche
sfruttare la sommatoria

 ....
proviamo a girarla un po'
SELECT
MAP.attrubute1
, MAP.attrubute2
, MAP.attrubute3
....
, MAP.attrubute30
, count(numero_azende.customer_id) numero aziende
from
mappatura_interest_type MAP,
(   SELECT customer_id
     FROM merceologico mer
     WHERE mer.interest_type_ita = MAP.interest_type
     and mer.interest_p_code_ita = MAP.PRIMARY
     and mer.interest_s_code_ita = MAP.secondary
     GROUP BY
      customer_id
 ) numero_aziende
GROUP BY
MAP.attrubute1
, MAP.attrubute2
, MAP.attrubute3
....
, MAP.attrubute30
Questa query ti dovrebbe tirare fuori per gruppo di attibuti il numero della
aziende che vi fa' parte.
Dimmi se l'ho pensata corretta e  se ho errato qualche cosa....
Ciao
Alex

/* Formatted on 2003/12/18 16:42 (Formatter Plus v4.8.0) */
SELECT   MAP.attribute1, COUNT (numero_aziende.customer_id)
numero_aziende
    FROM mappatura_interest_type MAP,
         (SELECT   customer_id
              FROM merceologico mer
             WHERE mer.interest_type_ita = MAP.interest_type
               AND mer.interest_p_code_ita = MAP.PRIMARY
               AND mer.interest_s_code_ita = MAP.secondary <---errore
          GROUP BY mer.customer_id) numero_aziende
GROUP BY MAP.attribute1
mi segnala errore su MAP.secondary "nome colonna non valido"
Mah ?
Ehi...grazie per l'aiuto

ops cosi' e' ok
/* Formatted on 2003/12/18 16:47 (Formatter Plus v4.8.0) */
SELECT   MAP.attribute1, COUNT (numero_aziende.customer_id)
numero_aziende
    FROM mappatura_interest_type MAP,
         (SELECT   customer_id
              FROM merceologico mer, mappatura_interest_type MAP
             WHERE mer.interest_type_ita = MAP.interest_type
               AND mer.interest_p_code_ita = MAP.PRIMARY
               AND mer.interest_s_code_ita = MAP.secondary


 Ehi...grazie per l'aiuto
Ci si prova :-)
Ciao
Alex

ma non funziona restituisce una tabella 2x2
con 
ATTRIBUTE1    NUMERO_AZIENDE
-1			13612
0			2538638
Cmq e' un buono spunto, a me intriga il fatto che posso anche sommare
i  -1 al posto di contare i record...
pensiamoci tutti !

> ma non funziona restituisce una tabella 2x2
Si...rivedendola...non mi pare di aver scritto una cosa funzionante.
Scusami ma senza avere la base dati sotto mi risulta un po' difficile.
Prova cosi':
SELECT
MAP.attrubute1
, MAP.attrubute2
, MAP.attrubute3
....
, MAP.attrubute30
, count(mer.customer_id) numero aziende
from
mappatura_interest_type MAP, merceologico mer
WHERE mer.interest_type_ita = MAP.interest_type
     and mer.interest_p_code_ita = MAP.PRIMARY
     and mer.interest_s_code_ita = MAP.secondary
GROUP BY
MAP.attrubute1
, MAP.attrubute2
, MAP.attrubute3
....
, MAP.attrubute30
In questa query ho ipotizzato che non ci sia ripetuta piu' di una volta la
stessa azienda nella tabella merceologico.
Ciao
Alex