Restituire il totale di una query

di il
16 risposte

Restituire il totale di una query

Salve a tutti,

sto cercando di fare una query che mi restituisca il numero totale dei campi.
Mi spiego meglio:
La query seguente:
select campo1 from MyTable
Mi restituisce 100 righe
Con la query sottostante ottengo, invece, solo il numero delle righe.
select count(campo1) from MyTable
Adesso vorrei avere il numero totale delle righe selezionando due campi anziché 2:

select campo1, campo2 from MyTable
Mi restituisce 150 righe.
Adesso vorrei fare una query che mi restituisca solo il numero delle righe, stile:

select count(campo1, campo2) fromt MyTable
Oppure
select campo1, campo2 count(campo1, campo2) from MyTable;
Il problema che ho provato diverse sintassi ma senza esito. Ottengo sempre errore di sintassi.
Dove sbaglio?

P.S.
Purtroppo sto usando Informix, spero di non essere off topic in questa sezione, ma purtroppo non sapevo dove scrivere.

Grazie

16 Risposte

  • Re: Restituire il totale di una query

    Sono un po' confuso: vuoi sapere quanti campi ci sono nella tabella?
    Perchè da quanto intuisco stai confondendoti con l'esistenza di righe NULL
    La tabella ha un solo numero di righe, la sua cardinalità.
    Forse intendi count(qualcosa) where QUALCOSA is not null?
  • Re: Restituire il totale di una query

    Si, forse sono stato un po' criptico, ma volevo evitare di complicare la domanda. Comunque la tua deduzione è esatta. In realtà la cosa è leggermente più ramificata.
    Comunque in sintesi:
    Dati 2 campi in una tabella vorrei sapere quanti campi not null o <> '' ci sono.
    Riprendendo il mio esempio:
    La query:
    
    select campo1, campo2 from MyTable where (campo1 is not nul or <> '') and (campo2 is not null or <> ')'
    
    Mi restituisce, ad esempio, 100 righe, escludendo tutti i campi che non contengono dati.
    Adesso vorrei fare una query che mi restituisca solo 100 utilizzando COUNT, sempre che sia la strada giusta.
    Il mio problema che vorrei fare la COUNT di due campi escludendo quelli vuoti e nulli, ma non riesco a capire la sintassi da utilizzare.
    Ho provato con:
    
    select count(campo1, campo2) from MyTable where (campo1 is not null or <> '') and (campo2 is not null or <> '')
    
    Ma mi restituisce errore di sintassi.
    Spero di non avere fatto degli errori anche nel riportare gli esempi, ma servono solo per cercare di fare capire cosa vorrei avere come risultato.

    Grazie mille per l'aiuto.
  • Re: Restituire il totale di una query

    Continua a essere un poco criptico.
    Comunque basta
    Select count(*) as quanti from boh where blablabla...

    Ci sono alternative con coalesce e concat, ma dipendono dallo rdbms
  • Re: Restituire il totale di una query

    @ljt:

    primo)

    NON DEVI complicare la domanda,

    DEVI utilizzare la terminologia in modo corretto, SE NO qui' non ci capisce niente nessuno, perche' NON POSSIAMO sapere come TU utilizzi i termini.

    secondo)

    l'SQL ha una BEN DEFINITA sintassi e semantica. NON SI VA A CASACCIO, a tentativi.
    Si STUDIA che cosa e' un modello relazionale dei dati, COME SI FANNO LE QUERY con l'SQL, e solo a questo punto puoi metterti li a fare le query.

    Nel tuo caso, CON UNO SFORZO di immaginazione (che potrebbe PURE essere sbagliato), se tu vuoi avere SOLO 100 record, in SQL Server si usa :

    SELECT TOP <n> .... FROM ... WHERE ...

    oppure altri DBMS (NON database), usano la sintassi

    SELECT ... LIMIT <n>
  • Re: Restituire il totale di una query

    Dati 2 campi in una tabella vorrei sapere quanti campi not null o <> '' ci sono.
    Non si capisce benissimo se entrambi devono essere non vuoti (cioè AND), oppure se uno solo di essi (OR).
    Supponendo che ENTRAMBI debbano essere non vuoti la risposta direi essere
    select count(*) from MyTable where (campo1 is not nul or <> '') and (campo2 is not null or <> ')'
    In realtà più qualcosa del tipo (nuLL con due elle)
    select count(*) from MyTable where 
    ((campo1 is not null) or (campo1 <> ''))
    AND
    ((campo2 is not null) or (campo2 <> ''))
    
    Se hai una chiave primaria, che è ontologicamente non-vuota, puoi anche mettere
    count(nomedellachiaveprimaria)
    ma non è che cambi più di tanto

    In certi casi potresti usare qualcosa di diverso, tipo LUNGHEZZACAMPO>0, a seconda del programma che usi potrebbe essere più efficiente di <> '', ma sono piccolezze essenzialmente per "malati"
  • Re: Restituire il totale di una query

    migliorabile ha scritto:


    @ljt:
    secondo)
    l'SQL ha una BEN DEFINITA sintassi e semantica. NON SI VA A CASACCIO, a tentativi.
    Si STUDIA che cosa e' un modello relazionale dei dati, COME SI FANNO LE QUERY con l'SQL, e solo a questo punto puoi metterti li a fare le query.
    Anche se la semantica risulta sempre uguale, purtroppo però, non sempre la sintassi tra i vari "ambienti" sql (e per ambienti intendo postgres, mysql, Microsoft SQL etct etc ) risulta perfettamente uguale.
    Infatti ho specificato che mi sono trovato in difficoltà con la sintassi e non con la semantica.

    Comunque mille grazie per il chiarimento.
  • Re: Restituire il totale di una query

    Dati 2 campi in una tabella vorrei sapere quanti campi not null o <> '' ci sono.
    Non si capisce benissimo se entrambi devono essere non vuoti (cioè AND), oppure se uno solo di essi (OR).
    Supponendo che ENTRAMBI debbano essere non vuoti la risposta direi essere
    select count(*) from MyTable where (campo1 is not nul or <> '') and (campo2 is not null or <> ')'
    In realtà più qualcosa del tipo (nuLL con due elle)
    select count(*) from MyTable where 
    ((campo1 is not null) or (campo1 <> ''))
    AND
    ((campo2 is not null) or (campo2 <> ''))
    


    Si scusami, in realtà volevo dire:
    Dati 2 campi in una tabella vorrei sapere quanti campi ci sono esclusi not null AND <> ''.
  • Re: Restituire il totale di una query

    +m2+ ha scritto:


    Continua a essere un poco criptico.
    Comunque basta
    Select count(*) as quanti from boh where blablabla...

    Ci sono alternative con coalesce e concat, ma dipendono dallo rdbms
    Ho provato a utilizzare il tuo esempio, ma non ottengo il risultato voluto in quanto il count è riferito a tutti i campi, in realtà io volevo limitarlo solo a due.
    Stile:
    
    select count(campo1, campo2) from boh where blabla
    
    Grazie
  • Re: Restituire il totale di una query

    Il count è sempre riferito alle righe, non ai campi.
    continuo a non capire che cosa vuoi ottenere.
    posta un elenco di righe e del risultato che vuoi
  • Re: Restituire il totale di una query

    La tabella CLIENTI, ad esempio, è composta da:
    
    NOME         INDIRIZZO         CITTA                MAIL
    Pippo         Via vai, 10         Topolinia          pippo@mail.it
    null           Via da qui, 20     Topolinia          pluto@mail.com
    null           Via Verdi, 21      Paperopoli        paperino@mail.it
    Qui            Via Dante, 14     Paperopoli        qui@mail.it
    Quo           Via Roma, 16      Paperopoli        quo@mail.it
    Qua           Via Milano, 21    Paperopoli         qua@mail.it
    Pippo        Via Gialli, 12       Topolinia           pippo@mail.it
    pippus       Via po, 34           Paperopoli       qui@mail.it  
    
    All'interno della tabella posso avere più nominativi uguali o due emal uguali.
    Se faccio la query:
    
    select distinct mail, nome from clienti where mail <> '' 
    
    ottengo il numero: 8
    Se faccio la query
    
    select count(distinct mail) from CLIENTI where mail <> ''
    
    ottengo come risultato: 6
    Vorrei fare una query che mi restituisca SOLO il numero 8.
    Ho fatto la segutente query:
    
    select count (distinct nome) as totale_1, count (distinct mail) as totale_2 from Clienti where mail <> ''
    
    ed ottengo
    Totale_1 = 7
    Totale 2 = 6
    ma non è quello che voglio in quanto ottengo due valori cioè totale_1 e Totale_2.
    Esiste la possibilità di fare quello che chiedo?
    Ho trovato esempi in internet, stile
    
    select count(nome, mail) as totale from CLIENTI where mail <>''
    
    Ma mi restituisce errore di sintassi.

    Grazie ancora per l'aiuto
  • Re: Restituire il totale di una query

    Ciao,
    forse, anzi, probabilmente informix supporta le sub query ... prova ...
    
    select count(*)
    from
    (
      select distinct mail, nome from clienti where mail <> '' ) 
    )  q
    
  • Re: Restituire il totale di una query

    sspintux ha scritto:


    Ciao,
    forse, anzi, probabilmente informix supporta le sub query ... prova ...
    
    select count(*)
    from
    (
      select distinct mail, nome from clienti where mail <> '' ) 
    )  q
    
    Ho provato la query.
    L'ho modificata in:
    
    select count(*) from (select distinct mail, nome from clienti where mail <> '');
    
    In quanto mi sa che nel tuo esempio c'è una parentesi chiusa di troppo, ma purtroppo ho avuto il solito maledetto errore di syntax error, stile commodore 64...…….

    Grazie per la risposta
  • Re: Restituire il totale di una query

    Alcuni db vogliono obbligatoriamente l'alias per le sub query;
    vedi se sei più fortunato ( non ho informix per provare):
    
     select count(q.*) from (select distinct mail, nome from clienti where mail <> '')  q
    
    HTH
  • Re: Restituire il totale di una query

    sspintux ha scritto:


    Alcuni db vogliono obbligatoriamente l'alias per le sub query;
    vedi se sei più fortunato ( non ho informix per provare):
    
     select count(q.*) from (select distinct mail, nome from clienti where mail <> '')  q
    
    HTH
    Nel frattempo ho ritrovato la sintassi giusta e grazie al tuo esempio ho risolto:
    La query più o meno è la seguente:
    
    select count (distinct mail)as totale from clienti where mail in (select distinct mail from clienti where mail <> '' and tipo = 'C');
    
    Che poi equivale a:
    
    select count (distinct mail) as totale from clienti where mail <> ' and tipo = 'C';
    
    In pratica ho aggiunto alla query un campo che si chiama "tipo" dove se è 'C' = cliente, 'F' = fornitore.
    In questo modo torna alla perfezione.

    Ringrazio tutti per l'aiuto.





    Grazie di nuovo
Devi accedere o registrarti per scrivere nel forum
16 risposte