PDA

View Full Version : [SQL] Query impossibile?


MaxDembo81
12-05-2010, 10:30
Salve ho una tabella formata dai seguenti dati

Chiave,Codice, Stato, Motivo_annullamento, Data_creazione, Data_inzio, Data_fine e altri campi non importanti

i record sono del tipo:

1, TO000000000JH , 'CL', ' ', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
2, TO000000000JH , 'AB', ' ', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
3, TO000000000JH , 'CL', 'TEC', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
4, TO000000000JH , 'CL', ' ', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
5, TO000000000JH , 'AB', ' ', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
6, TO000000000JH , 'CL', 'PER', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
7, TO000000000JH , 'CL', 'PER', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04
8, TO000000000JH , 'CL', ' ', 01/01/2010 10.00, 01/01/2010 10.02, 01/01/2010 10.04



lasciando perdere il fatto che ho messo le date tutte uguali e il codice uguale vorrei una query che, dati come parametri il codice ed eventualemnte mese/giorno, mi restituisse un riga del tipo:

Codice, Count(*), Count(CL) con motivo_annullamento = ' ', Count(AB), Count(Motivo_Annullamento='TEC'), COunt(Motivo_annullamento='PER')

Dunque nel nostro caso:

TO000000000JH, 8, 3, 2, 1, 2

Che alla fine mi sta a significare che quel codice ha ricevuto 8 chiamate, 3 chiuse in modo corretto, 2 "abortite", 1 annullata con motivo TEC e 2 annullate con motivo PER. Un riepilogo insomma!

E' possibile farlo con sql server?
Grazie :D

Kralizek
12-05-2010, 12:50
prova qualcosa tipo...


SELECT
Codice,
COUNT(*),
(SELECT COUNT(*) FROM Tabella T2 WHERE T2.Codice = T1.Codice AND T2.Stato='AB') AS X0,
(SELECT COUNT(*) FROM Tabella T2 WHERE T2.Codice = T1.Codice AND T2.Stato='CL' AND T2.Motivo_annullamento = '') AS X1,
(SELECT COUNT(*) FROM Tabella T2 WHERE T2.Codice = T1.Codice AND T2.Stato='CL' AND T2.Motivo_annullamento = 'TEC') AS X2
(SELECT COUNT(*) FROM Tabella T2 WHERE T2.Codice = T1.Codice AND T2.Stato='CL' AND T2.Motivo_annullamento = 'PER') AS X3
FROM
Tabella T1
--WHERE
-- Codice = @Codice
GROUP BY
Codice


eventualmente rimuovi il commentato ;)

kk3z
12-05-2010, 14:31
COUNT(IF()) si può usare?

SELECT
Codice, COUNT(*) count1,
COUNT(IF(Stato='AB', 1,NULL)) count2,
COUNT(IF(Motivo_annullamento = '', 1,NULL)) count3,
COUNT(IF(Motivo_annullamento = 'TEC', 1,NULL)) count4,
COUNT(IF(Motivo_annullamento = 'PER', 1,NULL)) count5
FROM
Tabella
ecc ecc

Kralizek
12-05-2010, 14:34
è TSQL valido? o.O

kk3z
12-05-2010, 17:27
Boh? Non ho sql server :ciapet:

lupoxxx87
12-05-2010, 18:23
ai rigori dell'sql standard
direi di no

gugoXX
12-05-2010, 19:43
poiche' COUNT come funzione di gruppo conta solo le righe diverse da NULL, direi che potrebbe andare


SELECT
Codice, COUNT(*) count1,
COUNT( CASE WHEN Stato='AB' THEN 1 ELSE NULL END) count2,
COUNT( CASE WHEN Motivo_annullamento = '' THEN 1 ELSE NULL END) count3,
COUNT( CASE WHEN Motivo_annullamento = 'TEC' THEN 1 ELSE NULL END) count4,
COUNT(CASE WHEN Motivo_annullamento = 'PER' THEN 1 ELSE NULL END) count5
FROM
Tabella
ecc ecc

Ma anche SUM va bene.

MaxDembo81
12-05-2010, 23:32
La versione di Krazalizek funziona.

Ora mi sorge un dubbio.
Se io volessi restringere le date ad un determinato mese/giorno devo inserire la clausola (MONTH(Data_creazione='05')) anche nelle varie X0, X1, X2 (vedi esempio Krazalizek)? Perchè dalla prova veloce che ho fatto non mi tornano i risultati :confused:

Domanda 2: e se io volessi fare un prova dicendo "fammi vedere tutti i mesi" come faccio? Perchè ho provato (MONTH(Data_creazione)='%') oppure a mettere in una stored procedure e passare NULL oppure con * ma non funziona.
Si può fare?

banryu79
13-05-2010, 08:10
Sintax error in:

La versione di Krazalizek funziona.

Unknown identifier: 'Krazalizek' :D

MaxDembo81
14-05-2010, 12:31
Kralizek :D

Kralizek
14-05-2010, 19:26
:oink:

MaxDembo81
14-05-2010, 20:19
a parte il lapsus mi sapete aiutare?

gugoXX
14-05-2010, 20:26
a parte il lapsus mi sapete aiutare?

Prova la mia, con la WHERE che ti serve.
Ricordati il GROUP BY

MaxDembo81
21-05-2010, 11:50
ok ho provato anche la tua gugo ma sono punto e a capo.

fai conto che la stia modificando

ALTER PROCEDURE [dbo].[spStatistiche](@Centro as NVARCHAR(6), @Codice as NVARCHAR(15), @Mese as nchar(2))

.
.
.
.
.
.

WHERE (Codice= @Codice) and (Centro=@Centro)
and (MONTH(Data_creazione)=@Mese)


poi la eseguo


USE [DBPROVA]
GO

DECLARE @return_value int

EXEC @return_value = [dbo].[spStatistiche]
@Centro = N'TS',
@Codice = N'To000000000JH',
@Mese='04'

GO



fino a qua funziona.
Ma rimane il problema che se voglio avere Mese=% ovvero tutte quelle di tutti i mesi mi da errore "Messaggio 245, livello 16, stato 1, procedura spStatistiche, riga 18
Conversion failed when converting the nvarchar value '% ' to data type int."

:help:

kk3z
21-05-2010, 15:27
SELECT
Codice, COUNT(*) count1,
COUNT(IF(Stato='AB', 1,NULL)) count2,
COUNT(IF(Motivo_annullamento = '', 1,NULL)) count3,
COUNT(IF(Motivo_annullamento = 'TEC', 1,NULL)) count4,
COUNT(IF(Motivo_annullamento = 'PER', 1,NULL)) count5
FROM
Tabella
ecc ecc
è uguale a
SELECT
Codice, COUNT(*) count1,
COUNT( CASE WHEN Stato='AB' THEN 1 ELSE NULL END) count2,
COUNT( CASE WHEN Motivo_annullamento = '' THEN 1 ELSE NULL END) count3,
COUNT( CASE WHEN Motivo_annullamento = 'TEC' THEN 1 ELSE NULL END) count4,
COUNT(CASE WHEN Motivo_annullamento = 'PER' THEN 1 ELSE NULL END) count5
FROM
Tabella
ecc ecc

non capisco perchè una non è sql standard mentre l'altra si :mah:

Kralizek
21-05-2010, 15:38
perchè IF non è supportato in quella posizione.

MaxDembo81
23-05-2010, 15:44
:help: