+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

[SQL]Count

  1. #1
    Uccio87 non è in linea Scolaretto
    Salve,
    devo creare una query! tabella dipendenti della giornata: Cognome | Nome | vers
    è una tabella delle bollature nel campo vers c'è 'E' = entrata o 'U' = uscita
    io voglio vedere i dipendenti presenti in azienda! quindi se le entrate per Tizio sono maggiori delle uscite vuol dire che è in azienda! ho provato così ma non funziona come vorrei

    SELECT COGNOME, NOME
    WHERE (SELECT COUNT(VERS) FROM [Dipendenti della giornata] WHERE VERS LIKE 'E')>(SELECT COUNT(VERS) FROM [Dipendenti della giornata] WHERE VERS LIKE 'U')
    FROM [Dipendenti della giornata];
    
    perchè non effettua una conta per ogni dipendente ma fa un conteggio generale confrontandoli tutti!

    Grazie.
    Ultima modifica di Uccio87; 03-02-2011 12:02 

  2. #2
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    - Quale DB stai usando?
    - Nella domanda stai parlando di 2 tabelle, ma nella query c'e ne una sola.

    La query da te postata non conforme lo standard del SQL [SELECT]..cosa..[FROM]..da dove[WHERE]..condizioni
    Inoltre per selezionare le record da 2 o più tabelle legati su uno o più campi, dovresti usare l'operatore JOIN.

    Posta qui anche la struttura delle tabelle.
    ℹ️ Leggi di più su bumm ...

  3. #3
    L'avatar di Cteniza
    Cteniza non è in linea Amanuense
    Una query di questo tipo:
    USE dbprova;
    SELECT     distinct codice, (select COUNT(e.codice) from EntrateUscite as e where EntrateUscite.codice = e.codice) as totale 
    FROM         entrateuscite
    where data = '2010-02-02'
    
    Restituisce il count per codice se dispari è presente se pari è assente (a meno che non ci siano più uscite che entrate!)
    ℹ️ Leggi di più su Cteniza ...

  4. #4
    Uccio87 non è in linea Scolaretto
    Quote Originariamente inviato da bumm Visualizza il messaggio
    - Quale DB stai usando?
    - Nella domanda stai parlando di 2 tabelle, ma nella query c'e ne una sola.

    La query da te postata non conforme lo standard del SQL [SELECT]..cosa..[FROM]..da dove[WHERE]..condizioni
    Inoltre per selezionare le record da 2 o più tabelle legati su uno o più campi, dovresti usare l'operatore JOIN.

    Posta qui anche la struttura delle tabelle.
    Il Database è access.
    La tabella dipendenti della giornata è:
    Cognome | Nome | Vers
    Tizio | Pino | E
    Tizio | Pino | U
    Caio | Tino | E
    Fino | Gino | E
    Fino | Gino | U

    Io voglio restituire come da esempio: Caio Tino perchè è entrato ma non è ancora uscito!

  5. #5
    L'avatar di bumm
    bumm non è in linea Topo di biblioteca Ultimo blog: [VB2010] ComboBox ed Enumeratori
    Prova questo:
    SELECT t1.Nome, t1.Cognome, t1.Vers
    FROM EntrateUscite AS  t1
    LEFT JOIN 
     (SELECT t3.Nome, t3.Cognome, t3.Vers FROM EntrateUscite AS t3
    INNER JOIN EntrateUscite AS t4
    ON t3.Nome=t4.Nome AND t3.Cognome=t4.Cognome
    WHERE t3.Vers='E' AND t4.Vers='U') AS t2
    ON t1.Nome=t2.Nome AND t1.Cognome=t2.Cognome
    WHERE t1.Vers='E'  AND  ((t2.Nome) Is Null);
    
    ℹ️ Leggi di più su bumm ...

  6. #6
    Uccio87 non è in linea Scolaretto
    Quote Originariamente inviato da bumm Visualizza il messaggio
    Prova questo:
    SELECT t1.Nome, t1.Cognome, t1.Vers
    FROM EntrateUscite AS  t1
    LEFT JOIN 
     (SELECT t3.Nome, t3.Cognome, t3.Vers FROM EntrateUscite AS t3
    INNER JOIN EntrateUscite AS t4
    ON t3.Nome=t4.Nome AND t3.Cognome=t4.Cognome
    WHERE t3.Vers='E' AND t4.Vers='U') AS t2
    ON t1.Nome=t2.Nome AND t1.Cognome=t2.Cognome
    WHERE t1.Vers='E'  AND  ((t2.Nome) Is Null);
    
    Me lo puoi spiegare perfavore?

    Non funziona in questo caso
    Cognome | Nome | Vers
    Tizio | Pino | E
    Tizio | Pino | U
    Caio | Tino | E
    Fino | Gino | E
    Fino | Gino | U
    Fino | Gino | E

    Mi restituisce Caio Tino ok ma dovrebbe resituirmi anche Fino Gino
    Ultima modifica di Uccio87; 04-02-2011 16:14 

  7. #7
    L'avatar di sLaSh17
    sLaSh17 non è in linea Scolaretto
    Ti propongo una soluzione a mio avviso molto intuitiva, che fra l'altro si basa su quanto avevi pensato già dall'inizio:
    selezionare i dipendenti per cui le entrate sono più delle uscite (detto così sembra si parli di soldi )
    (NB: ogni riferimento a persone realmenti esistenti NON è puramente casuale!)

    SELECT nome, cognome
    FROM
      (SELECT nome,cognome,COUNT(*) AS entrate
       FROM entrateuscite
       WHERE vers = 'e'
       GROUP BY nome,cognome) AS Entrate
          NATURAL LEFT JOIN
      (SELECT nome,cognome,COUNT(*) AS uscite
       FROM entrateuscite
       WHERE vers = 'u'
       GROUP BY nome,cognome) AS Uscite
    
    WHERE entrate > uscite OR uscite IS NULL
    
    E' molto semplice:
    SELECT nome,cognome,COUNT(*) as entrate
    FROM entrateuscite
    WHERE vers = 'e'
    GROUP BY nome,cognome
    
    questo da una tabella con le entrate totali di ogni dipendente: (nome | cognome | entrate)

    SELECT nome,cognome,COUNT(*) as uscite
    FROM entrateuscite
    WHERE vers = 'u'
    GROUP BY nome,cognome
    
    questo in modo simmetrico da una tabella con le uscite totali di ogni dipendente: (nome | cognome | uscite)

    Basta quindi fare un join naturale di queste due ed abbiamo una tabella del genere: (nome | cognome | entrate | uscite)
    Da questa basta selezionare i dipendenti cha hanno più entrate che uscite.

    NOTA importante
    Nel caso in cui ci sia un dipendente che è entrato una sola volta e non è ancora uscito, questo sarà presente nella tabella Entrate, con valore 1, ma NON sarà presente nella tabella Uscite, perchè non esiste nessuna riga della tabella con vers='u'.
    Per questo motivo bisogna usare un LEFT JOIN, in modo da considerare tutti i dipendenti che sono entrati almeno una volta, anche se non sono usciti (ovviamente non è possibile che un dipendente sia uscito senza entrare...)
    Di conseguenza nella tabella generata del join, ci saranno tuple in cui il valore uscite sarà NULL, che in questo caso dobbiamo considerare 0, e che quindi significa che il dipendente relativo è in azienda e dev'essere selezionato.

    Esempio:
    Partiamo da questa 'entrateuscite':
    SELECT * FROM entrateuscite;
    +-----------+---------+------+
    | nome      | cognome | vers |
    +-----------+---------+------+
    | salvatore | loria   | e    |
    | salvatore | loria   | u    |
    | salvatore | loria   | e    |
    | pasquale  | rullo   | e    |
    | giuseppe  | leone   | e    |
    | giuseppe  | leone   | u    |
    +-----------+---------+------+
    
    Creiamo la tabella intermedia Entrate e vediamo cosa ci sarà:
    SELECT nome,cognome,COUNT(*) as entrate
    FROM entrateuscite
    WHERE vers = 'e'
    GROUP BY nome,cognome;
    +-----------+---------+---------+
    | nome      | cognome | entrate |
    +-----------+---------+---------+
    | pasquale  | rullo   |       1 |
    | giuseppe  | leone   |       1 |
    | salvatore | loria   |       2 |
    +-----------+---------+---------+
    
    Qui ci sono tutti.
    Vediamo invece la tabella intermedia 'Uscite':
    SELECT nome,cognome,COUNT(*) as uscite
    FROM entrateuscite
    WHERE vers = 'u'
    GROUP BY nome,cognome;
    +-----------+---------+--------+
    | nome      | cognome | uscite |
    +-----------+---------+--------+
    | giuseppe  | leone   |      1 |
    | salvatore | loria   |      1 |
    +-----------+---------+--------+
    
    Si vede subito che manca 'pasquale rullo', il quale è entrato una volta ma non è mai uscito; usando un NATURAL JOIN soltanto, nella tabella intermedia su cui fare le select finale 'pasquale rullo' non ci sarebbe, il che è sbagliato:
    SELECT *
    FROM
        (SELECT nome,cognome,COUNT(*) AS entrate
        FROM entrateuscite
        WHERE vers = 'e'
        GROUP BY nome,cognome) AS Entrate
               NATURAL JOIN
        (SELECT nome,cognome,COUNT(*) AS uscite
        FROM entrateuscite
        WHERE vers = 'u'
        GROUP BY nome,cognome) AS Uscite;
    +-----------+---------+---------+--------+
    | nome      | cognome | entrate | uscite |
    +-----------+---------+---------+--------+
    | giuseppe  | leone   |       1 |      1 |
    | salvatore | loria   |       2 |      1 |
    +-----------+---------+---------+--------+
    
    Vediamo invece che usando il LEFT JOIN otteniamo tutti i dipendenti, ma di 'pasquale rullo' avremo l'attributo uscite = NULL:
    SELECT *
    FROM
        (SELECT nome,cognome,COUNT(*) AS entrate
        FROM entrateuscite
        WHERE vers = 'e'
        GROUP BY nome,cognome) AS Entrate
               NATURAL LEFT JOIN
        (SELECT nome,cognome,COUNT(*) AS uscite
        FROM entrateuscite
        WHERE vers = 'u'
        GROUP BY nome,cognome) AS Uscite;
    +-----------+---------+---------+--------+
    | nome      | cognome | entrate | uscite |
    +-----------+---------+---------+--------+
    | pasquale  | rullo   |       1 |   NULL |
    | giuseppe  | leone   |       1 |      1 |
    | salvatore | loria   |       2 |      1 |
    +-----------+---------+---------+--------+
    
    Per quanto detto prima, NULL significa che il dipendente è in azienda, quindi bisogna selezionarlo.
    Selezionando quindi sia i dipendenti con entrate > uscite, sia quelli con uscite NULL, otteniamo il risultato finale desiderato:
    SELECT nome, cognome
    FROM
      (SELECT nome,cognome,COUNT(*) AS entrate
       FROM entrateuscite
       WHERE vers = 'e'
       GROUP BY nome,cognome) AS Entrate
          NATURAL LEFT JOIN
      (SELECT nome,cognome,COUNT(*) AS uscite
       FROM entrateuscite
       WHERE vers = 'u'
       GROUP BY nome,cognome) AS Uscite
    WHERE entrate > uscite OR uscite IS NULL;
    +-----------+---------+
    | nome      | cognome | 
    +-----------+---------+
    | pasquale  | rullo   | 
    | salvatore | loria   |
    +-----------+---------+
    
    Ultima modifica di sLaSh17; 04-02-2011 18:05  Motivo: riferimenti
    ℹ️ Leggi di più su sLaSh17 ...

  8. #8
    Uccio87 non è in linea Scolaretto
    Quote Originariamente inviato da sLaSh17 Visualizza il messaggio
    Ti propongo una soluzione a mio avviso molto intuitiva, che fra l'altro si basa su quanto avevi pensato già dall'inizio:
    selezionare i dipendenti per cui le entrate sono più delle uscite (detto così sembra si parli di soldi )

    SELECT nome, cognome
    FROM
      (SELECT nome,cognome,COUNT(*) AS entrate
       FROM entrateuscite
       WHERE vers = 'e'
       GROUP BY nome,cognome) AS Entrate
          NATURAL LEFT JOIN
      (SELECT nome,cognome,COUNT(*) AS uscite
       FROM entrateuscite
       WHERE vers = 'u'
       GROUP BY nome,cognome) AS Uscite
    
    WHERE entrate > uscite OR uscite IS NULL
    
    E' molto semplice:
    SELECT nome,cognome,COUNT(*) as entrate
    FROM entrateuscite
    WHERE vers = 'e'
    GROUP BY nome,cognome
    
    questo da una tabella con le entrate totali di ogni dipendente: (nome | cognome | entrate)

    SELECT nome,cognome,COUNT(*) as uscite
    FROM entrateuscite
    WHERE vers = 'u'
    GROUP BY nome,cognome
    
    questo in modo simmetrico da una tabella con le uscite totali di ogni dipendente: (nome | cognome | uscite)

    Basta quindi fare un join naturale di queste due ed abbiamo una tabella del genere: (nome | cognome | entrate | uscite)
    Da questa basta selezionare i dipendenti cha hanno più entrate che uscite.

    NOTA importante
    Nel caso in cui ci sia un dipendente che è entrato una sola volta e non è ancora uscito, questo sarà presente nella tabella Entrate, con valore 1, ma NON sarà presente nella tabella Uscite, perchè non esiste nessuna riga della tabella con vers='u'.
    Per questo motivo bisogna usare un LEFT JOIN, in modo da considerare tutti i dipendenti che sono entrati almeno una volta, anche se non sono usciti (ovviamente non è possibile che un dipendente sia uscito senza entrare...)
    Di conseguenza nella tabella generata del join, ci saranno tuple in cui il valore uscite sarà NULL, che in questo caso dobbiamo considerare 0, e che quindi significa che il dipendente relativo è in azienda e dev'essere selezionato.

    Esempio:
    Partiamo da questa 'entrateuscite':
    SELECT * FROM entrateuscite;
    +-----------+---------+------+
    | nome      | cognome | vers |
    +-----------+---------+------+
    | salvatore | loria   | e    |
    | salvatore | loria   | u    |
    | salvatore | loria   | e    |
    | pasquale  | rullo   | e    |
    | giuseppe  | leone   | e    |
    | giuseppe  | leone   | u    |
    +-----------+---------+------+
    
    Creiamo la tabella intermedia Entrate e vediamo cosa ci sarà:
    SELECT nome,cognome,COUNT(*) as entrate
    FROM entrateuscite
    WHERE vers = 'e'
    GROUP BY nome,cognome;
    +-----------+---------+---------+
    | nome      | cognome | entrate |
    +-----------+---------+---------+
    | pasquale  | rullo   |       1 |
    | giuseppe  | leone   |       1 |
    | salvatore | loria   |       2 |
    +-----------+---------+---------+
    
    Qui ci sono tutti.
    Vediamo invece la tabella intermedia 'Uscite':
    SELECT nome,cognome,COUNT(*) as uscite
    FROM entrateuscite
    WHERE vers = 'u'
    GROUP BY nome,cognome;
    +-----------+---------+--------+
    | nome      | cognome | uscite |
    +-----------+---------+--------+
    | giuseppe  | leone   |      1 |
    | salvatore | loria   |      1 |
    +-----------+---------+--------+
    
    Si vede subito che manca 'pasquale rullo', il quale è entrato una volta ma non è mai uscito; usando un NATURAL JOIN soltanto, nella tabella intermedia su cui fare le select finale 'pasquale rullo' non ci sarebbe, il che è sbagliato:
    SELECT *
    FROM
        (SELECT nome,cognome,COUNT(*) AS entrate
        FROM entrateuscite
        WHERE vers = 'e'
        GROUP BY nome,cognome) AS Entrate
               NATURAL JOIN
        (SELECT nome,cognome,COUNT(*) AS uscite
        FROM entrateuscite
        WHERE vers = 'u'
        GROUP BY nome,cognome) AS Uscite;
    +-----------+---------+---------+--------+
    | nome      | cognome | entrate | uscite |
    +-----------+---------+---------+--------+
    | giuseppe  | leone   |       1 |      1 |
    | salvatore | loria   |       2 |      1 |
    +-----------+---------+---------+--------+
    
    Vediamo invece che usando il LEFT JOIN otteniamo tutti i dipendenti, ma di 'pasquale rullo' avremo l'attributo uscite = NULL:
    SELECT *
    FROM
        (SELECT nome,cognome,COUNT(*) AS entrate
        FROM entrateuscite
        WHERE vers = 'e'
        GROUP BY nome,cognome) AS Entrate
               NATURAL LEFT JOIN
        (SELECT nome,cognome,COUNT(*) AS uscite
        FROM entrateuscite
        WHERE vers = 'u'
        GROUP BY nome,cognome) AS Uscite;
    +-----------+---------+---------+--------+
    | nome      | cognome | entrate | uscite |
    +-----------+---------+---------+--------+
    | pasquale  | rullo   |       1 |   NULL |
    | giuseppe  | leone   |       1 |      1 |
    | salvatore | loria   |       2 |      1 |
    +-----------+---------+---------+--------+
    
    Per quanto detto prima, NULL significa che il dipendente è in azienda, quindi bisogna selezionarlo.
    Selezionando quindi sia i dipendenti con entrate > uscite, sia quelli con uscite NULL, otteniamo il risultato finale desiderato:
    SELECT nome, cognome
    FROM
      (SELECT nome,cognome,COUNT(*) AS entrate
       FROM entrateuscite
       WHERE vers = 'e'
       GROUP BY nome,cognome) AS Entrate
          NATURAL LEFT JOIN
      (SELECT nome,cognome,COUNT(*) AS uscite
       FROM entrateuscite
       WHERE vers = 'u'
       GROUP BY nome,cognome) AS Uscite
    WHERE entrate > uscite OR uscite IS NULL;
    +-----------+---------+
    | nome      | cognome | 
    +-----------+---------+
    | pasquale  | rullo   | 
    | salvatore | loria   |
    +-----------+---------+
    
    Perfetto! Bellissima spiegazione! Grazie

  9. #9
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da Uccio87 Visualizza il messaggio
    Perfetto! Bellissima spiegazione! Grazie
    Sì, ma il NATURAL LEFT JOIN come lo usi in Access?

    ℹ️ Leggi di più su gibra ...

  10. #10
    L'avatar di sLaSh17
    sLaSh17 non è in linea Scolaretto
    Quote Originariamente inviato da gibra Visualizza il messaggio
    Sì, ma il NATURAL LEFT JOIN come lo usi in Access?

    Non conosco access, ma penso (spero) che almeno consenti di fare il LEFT JOIN.
    Se è così, basta fare un LEFT JOIN sugli attributi comuni:
    SELECT nome, cognome
    FROM
      (SELECT nome,cognome,COUNT(*) AS entrate
       FROM entrateuscite
       WHERE vers = 'e'
       GROUP BY nome,cognome) AS Entrate
          LEFT JOIN
      (SELECT nome,cognome,COUNT(*) AS uscite
       FROM entrateuscite
       WHERE vers = 'u'
       GROUP BY nome,cognome) AS Uscite
          ON Entrate.nome = Uscite.nome AND Entrate.cognome = Uscite.cognome
    WHERE entrate > uscite OR uscite IS NULL;
    
    ℹ️ Leggi di più su sLaSh17 ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Query con COUNT e SUM
    Da pierovb nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 03-08-2020, 12:30
  2. Query con due count
    Da delfin96 nel forum MySQL
    Risposte: 8
    Ultimo Post: 02-01-2016, 12:56
  3. Select & Count
    Da roccolamann nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 16-07-2014, 13:42
  4. Select Count
    Da alice1 nel forum PHP
    Risposte: 2
    Ultimo Post: 25-10-2006, 15:19
  5. Query Con Count!
    Da logan nel forum PHP
    Risposte: 2
    Ultimo Post: 05-03-2006, 23:40