Aituo su Query Statistica

mercoledì 28 marzo 2007 - 08.22

gmt Profilo | Junior Member

Salve,

parliamo di SQL SERVER 2005

CREATE TABLE T1 (ID int, Anno int, MESE, int, NVOLTE int)

INSERT INTO T1 (1,2006,12,1)
INSERT INTO T1 (1,2006,11,2)
INSERT INTO T1 (1,2006,10,6)
INSERT INTO T1 (1,2006,8,2)
INSERT INTO T1 (1,2006,7,3)
INSERT INTO T1 (2,2006,12,1)
INSERT INTO T1 (2,2006,10,1)
INSERT INTO T1 (2,2006,9,6)
INSERT INTO T1 (2,2006,7,2)
INSERT INTO T1 (3,2006,11,1)
INSERT INTO T1 (4,2006,2,7)

La tabella parla di un cliente (ID) che ha frequenato il negozio nvolte (NVOLTE) nel mese (MESE) nell'anno (ANNO)

Io vorrei tirare fuori i clienti che nei mese di 12 e 11 Anno 2006 sono venuti meno di 2 volte e che nel contempo nei mesi 10, 9, 8, 7 sono venuti più di 5 volte.
Poi questi valori li faccio impostare all'operatore in maniera che riesce a controllare quali sono i clienti affezionati (che sono venuti molte volte nei mesi scorsi) e che non vengono più negli ultimi mesi.
Spero di essermi capito.. Sono due giorni che ci giro intorno ma non riesco..

Spero riusciate ad aiutarmi..
Grazie

lbenaglia Profilo | Guru

>Io vorrei tirare fuori i clienti che nei mese di 12 e 11 Anno
>2006 sono venuti meno di 2 volte e che nel contempo nei mesi
>10, 9, 8, 7 sono venuti più di 5 volte.

Ciao gmt,

Puoi risolvere elegantemente il problema definendo 2 Common Table Expression (CTE) che andrai a mettere in join:

USE tempdb; CREATE TABLE dbo.T1( ID int NOT NULL, Anno int NOT NULL, MESE int NOT NULL, NVOLTE int NOT NULL ); INSERT INTO dbo.T1 VALUES(1, 2006, 12, 1); INSERT INTO dbo.T1 VALUES(1, 2006, 11, 2); INSERT INTO dbo.T1 VALUES(1, 2006, 10, 6); INSERT INTO dbo.T1 VALUES(1, 2006, 8, 2); INSERT INTO dbo.T1 VALUES(1, 2006, 7, 3); INSERT INTO dbo.T1 VALUES(2, 2006, 12, 1); INSERT INTO dbo.T1 VALUES(2, 2006, 10, 1); INSERT INTO dbo.T1 VALUES(2, 2006, 9, 6); INSERT INTO dbo.T1 VALUES(2, 2006, 7, 2); INSERT INTO dbo.T1 VALUES(3, 2006, 11, 1); INSERT INTO dbo.T1 VALUES(4, 2006, 2, 7); WITH CTE_NovDec AS ( SELECT ID, SUM(NVOLTE) AS Visite FROM dbo.T1 WHERE Anno = 2006 AND Mese IN(11, 12) GROUP BY ID HAVING SUM(NVOLTE) < 2 ), CTE_LugAgoSetOtt AS ( SELECT ID, SUM(NVOLTE) AS Visite FROM dbo.T1 WHERE Anno = 2006 AND Mese IN(7, 8, 9, 10) GROUP BY ID HAVING SUM(NVOLTE) > 5 ) SELECT CTE1.ID , CTE1.Visite AS VisiteNovDec , CTE2.Visite AS VisiteLugAgoSetOtt FROM CTE_NovDec AS CTE1 INNER JOIN CTE_LugAgoSetOtt AS CTE2 ON CTE1.Id = CTE2.ID; /* Output: ID VisiteNovDec VisiteLugAgoSetOtt ----------- ------------ ------------------ 2 1 9 (1 row(s) affected) */ DROP TABLE dbo.T1;

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gmt Profilo | Junior Member

Bello! Si credo che vada bene.. io le query CTE le devo creare a run time; nel senso che la clausula WHERE viene come parametro poi nella store procedure credo la query e la eseguo..

SET @STRSQL = 'SELECT ...'
EXEC(@STRSQL)

Credo e spero funzioni lo stesso, al limite mi creo due tabelle temporanee e risolvo (spero).

Ti faccio allora una domanda, forse stupida, che differenza c'è tra CTE e crearsi delle tabelle temporanee (#pippo)

lbenaglia Profilo | Guru

>Bello! Si credo che vada bene.. io le query CTE le devo creare
>a run time; nel senso che la clausula WHERE viene come parametro
>poi nella store procedure credo la query e la eseguo..
>
> SET @STRSQL = 'SELECT ...'
> EXEC(@STRSQL)
Che brutto
Guarda a cosa andrai incontro:
http://www.sommarskog.se/dynamic_sql.html

>Credo e spero funzioni lo stesso, al limite mi creo due tabelle
>temporanee e risolvo (spero).
>
>Ti faccio allora una domanda, forse stupida, che differenza c'è
>tra CTE e crearsi delle tabelle temporanee (#pippo)
Le CTE non sono oggetti, sono solo query eseguite a runtime...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5