Newsgroup: it.comp.lang.visual-basic
Titolo: [QUERY] Condizioni diverse

Ciao a tutti!
Uso MySQL 4.1.2 e dovrei fare una query che mi esegua piů COUNT(*) su 
una stessa tabella, ma non ho proprio idea di come fare questa cosa se 
non con l'utilizzo di query distinte e separate.
Il riassunto breve della situazione č questa:
Tabella OPERATORI:
+--------+---------+----------+
| userid | cognome | nome     |
+--------+---------+----------+
|      0 | ZZZZ    | ZZZZ     |
|     10 | CICCIO  | PALLOZZA |
|     11 | PINCO   | PALLINO  |
+--------+---------+----------+
Tabella CONTRATTI:
+--------+----------------+-------+
| userid | codiceservizio | stato |
+--------+----------------+-------+
|     12 | TR1-72         |     3 |
|     55 | TR1-72         |     3 |
|     25 | TR1-72         |     3 |
|     10 | TR1-72         |     3 |
|     11 | TR1-72         |     3 |
|     48 | TR1-72         |     3 |
|     18 | TR1-72         |     3 |
|     41 | TR1-72         |     1 |
|     24 | TR1-72         |     3 |
|     24 | TR1-72         |     3 |
+--------+----------------+-------+
Sto cercando di fare una query che mi restituisca l'elenco degli 
operatori e per ognuno di loro mi dica quanti contratti ha concluso e 
quanti sono stati annullati (annullato: stato=1).
Per ora sono riuscito ad ottenere l'elenco degli operatori ed i 
contratti conclusi con questa query:
   select concat(u.cognome, ' ', u.nome) as operatore, t1.conclusi
   from utenti u right join
   (
     select userid, count(*) as conclusi
     from contratti
     where datacontratto>='2004/07/01'
     group by userid
   ) as t1
   on u.userid=t1.userid
   order by operatore asc
ma per ottenere una colonna con il numeri di contratti il cui stato č 1, 
devo fare un altro join? Non posso in qualche modo sfruttare la query 
piů interna?
-- 
Quando noi ignoranti eravamo di piů,
tutto era piů bello...
(Adriano Celentano)

[Darkbyte [Work]] scrisse:
(snip)
darei una occhiata all'istruzione sql group by
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 quanti sono stati annullati (annullato: stato=1).
Scrivo a braccio e, ovviamente, non leggendo le tue tabelle ma in modo
generico. Adegua poi tu la cosa:
SELECT A.OPERATORE,
CONTATORE1=
SUM( CASE
    WHEN B.STATO1='<vedi tu>' THEN 1
    ELSE 0
    END),
CONTATORE2=
SUM( CASE
    WHEN B.STATO2='<vedi tu' THEN 1
    ELSE 0
    END)
FROM TABELLA1 AS A
LEFT OUTER JOIN
    TABELLA2 AS B
ON 
A.ID
=B.IDPADRE
GROUP BY A.OPERATORE
Questo, per Sql-Server.
Non so in MySql come sia la sintassi del Case. Per le tue necessità,
comunque, va benissimo anche un IIF (Se mysql lo supporta).
Ciao
Alberto

> darei una occhiata all'istruzione sql group by
Thx! Non ci avevo proprio pensato!!!
Ho risolto egregiamente con:
SELECT CONCAT(T.UserID, ' - ', U.Cognome, ' ', U.Nome) AS Operatore,
        SUM(T.Tot) AS Conclusi,
        MAX(T.Ann) AS Annullati
FROM
(
  SELECT UserID, COUNT(*) AS Tot, IF(Stato=1, COUNT(Stato), 0) AS Ann
  FROM Contratti
  WHERE DataContratto BETWEEN '2004/06/01' AND '2004/06/30'
  GROUP BY UserID, Stato
) AS T
LEFT JOIN Utenti U
ON U.UserID=T.UserID
GROUP BY T.UserID
ORDER BY Conclusi DESC
sono bastate un paio di prove sulla query principale (quella interna) e 
poi qualche minuto di riflessione su quella piů esterna.
Ah... MySQL quanto ti amo! :)


Ti ringrazio Albe... ho risolto con un bel group by :)
