+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [SQL]Errore di Group By

  1. #1
    Hamelin [FL] non è in linea Novello
    Post
    24

    [SQL]Errore di Group By

    Una group by mi dà un errore cui non riesco a venire a capo... provo a sottoporvela, chissà che qualcuno mi riesca a aiutare

    La versione funzionante è la seguente:

    codice:
    SELECT @UserId,count(distinct [Data Login]),
    CASE
    WHEN count(distinct [Data Login]) > 48 THEN '5.Super'
    WHEN count(distinct [Data Login]) > 12 AND count(distinct [Data Login]) <= 48 THEN '4.Normal'
    WHEN count(distinct [Data Login]) > 0 AND count(distinct [Data Login]) <= 12 THEN '3.Occasionale'
    END
    Se invece la modifico come servirebbe a me, e cioè nel modo seguente:

    codice:
    SELECT @UserId,count(distinct [Data Login]),
    CASE
    WHEN count(distinct [Data Login]) > 48 THEN '5.Super'
    WHEN count(distinct [Data Login]) > 12 AND count(distinct [Data Login]) <= 48
    AND (([Data Login] BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio) AND (count(distinct [Data Login]) > 2))
    AND (([Data Login] BETWEEN DATEADD(day, -30, @DataInizio) AND DATEADD(day, -15, @DataInizio)) AND (count(distinct [Data Login]) > 2))
    AND (([Data Login] BETWEEN DATEADD(day, -45, @DataInizio) AND DATEADD(day, -30, @DataInizio)) AND (count(distinct [Data Login]) > 2))
    THEN '4.Normal'
    WHEN count(distinct [Data Login]) > 0 AND count(distinct [Data Login]) <= 12 THEN '3.Occasionale'
    END
    Mi dà errore perchè dice la colonna [Data Login] non è contenuta nella GROUP BY... il fatto è che io non devo raggruppare anche per data login, o non mi tornano più i risultati che vorrei ^^"

    Sapete dirmi dove sbaglio? Grazie mille per l'attenzione

  2. #2
    Luogo
    Lazio
    Post
    1,720
    Blogs
    21
    Quote Originariamente inviato da Hamelin [FL]
    Una group by mi d&#224; un errore cui non riesco a venire a capo... provo a sottoporvela
    Ciao,

    per mettere in condizione chiunque abbia voglia di provarre agevolamente
    (cio&#232; senza doversi creare le tabelle e metterci dei dati significativi)
    dovresti postare :
    - la struttura delle tabelle (intendo le CREATE TABLE)
    - un p&#242; di dati significativi (intendo INSERT INTO)
    - il risultato che ti aspetti

    P.S.
    metti anche quella completa che hai fatto (perche manca la FROM)
    e cerca di formattarla in modo leggibile
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  3. #3
    Hamelin [FL] non è in linea Novello
    Post
    24
    Ci provo, ma dato che uso SqlServerReportingServices, che si comporta tipo Access per la creazione delle tabelle e l'inserimento dei dati, dovr&#242; fare io a mano i comandi e non sono sicuro di farli giusti ^^"

    codice:
    CREATE TABLE TabellaLogin
    ( UserId int
    DataLogin date )
    codice:
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '01/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '02/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '03/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '04/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '05/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '06/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '07/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '08/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '09/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '10/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '11/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '12/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '01/03/2006')
    A questo punto la query funzionante:

    codice:
    SELECT UserId,count(distinct DataLogin) AS Conteggio,
        CASE
            WHEN count(distinct DataLogin) > 48 THEN '5.Super'
            WHEN count(distinct Data Login) > 12 AND count(distinct Data Login) <= 48 THEN '4.Normal'
            ELSE '3.Occasionale'
        END AS Tipo
    FROM TabellaLogin
    WHERE DataLogin BETWEEN '01/01/2006' AND '01/04/2006'
    GROUP BY UserId
    dovrebbe restituire:

    UserId Conteggio Tipo
    1 13 Normal

    Invece la query con la clausola ulteriore

    codice:
    SELECT UserId,count(distinct DataLogin) AS Conteggio,
        CASE
            WHEN count(distinct DataLogin) > 48 THEN '5.Super'
            WHEN count(distinct DataLogin) > 12 AND count(distinct DataLogin) <= 48
                AND ((DataLogin BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio) AND (count(distinct DataLogin) > 2))
                AND ((DataLogin BETWEEN DATEADD(day, -30, @DataInizio) AND DATEADD(day, -15, @DataInizio)) AND (count(distinct DataLogin) > 2))
                AND ((DataLogin BETWEEN DATEADD(day, -45, @DataInizio) AND DATEADD(day, -30, @DataInizio)) AND (count(distinct DataLogin) > 2))
            THEN '4.Normal'
            ELSE '3.Occasionale'
        END AS Tipo
    FROM TabellaLogin
    WHERE DataLogin BETWEEN '01/01/2006' AND '01/04/2006'
    GROUP BY UserId
    Settando @DataInizio a '15/03/2006' e una volta corretta dovrebbe restituire:

    UserId Conteggio Tipo
    1 13 Occasionale

    Perch&#232; appunto non rispetta la clausola di aver fatto almeno 2 login nei 15 giorni prima la @DataInizio

    Spero di aver dato tutte le informazioni utili ad aiutarvi ad aiutarmi (ti ringrazio e scusa per la mancanza)
    Ultima modifica di Hamelin [FL]; 28-04-2006 12:02 

  4. #4
    Luogo
    Lazio
    Post
    1,720
    Blogs
    21
    Quote Originariamente inviato da Hamelin [FL]
    Ci provo, ma dato che uso SqlServerReportingServices, che si comporta tipo Access per la creazione delle tabelle e l'inserimento dei dati, dovrò fare io a mano i comandi e non sono sicuro di farli giusti ^^"
    Infatti! Ma non hai Query Analyzer per provare ?
    ....comunque, anche se non sono sicuro di aver capito la logica,
    puoi verificarti ed aggiustarti questa che segue
    (potresti farti una funzione a parte per calcolare il numero dei login
    di uno UserID tra 2 date)


    codice:
    declare @datainizio datetime
    set @datainizio='20060315'
    
    Select Q.UserID, Q.Conteggio, 
    
           (CASE WHEN Conteggio > 48 THEN '5.Super'
             ELSE 
              CASE WHEN (Conteggio > 12 AND Conteggio <= 48)  
                         AND (CDL15 > 2) AND (CDL3015 > 2) AND (CDL4530 >2)
                    THEN '4.Normal'
                    ELSE '3.Occasionale'
             END
           END) AS Tipo
    
    FROM
    (
      SELECT UserId,count(distinct DataLogin) AS Conteggio,
      (
       select count(distinct DataLogin) FROM TabellaLogin
       where UserID=T.UserID 
       and DataLogin BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio
      ) as CDL15,
    
     (
      select count(distinct DataLogin) FROM TabellaLogin
      where UserID=T.UserID 
        and DataLogin BETWEEN DATEADD(day, -30, @DataInizio) AND DATEADD(day, -15, @DataInizio)
     ) as CDL3015,
    
     (
      select count(distinct DataLogin) FROM TabellaLogin
      where UserID=T.UserID 
       and  DataLogin BETWEEN DATEADD(day, -45, @DataInizio) AND DATEADD(day, -30, @DataInizio)
     ) as CDL4530
    
    FROM TabellaLogin T
    WHERE T.DataLogin BETWEEN '01/01/2006' AND '01/04/2006'
    group by UserID
    ) as q
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  5. #5
    Hamelin [FL] non è in linea Novello
    Post
    24
    La logica mi sembra corretta, ma purtroppo devo gettare la spugna: devo inserirla in una Stored Procedure più complessa di SQL Server Reporting Services, e con tutte quelle sottoselect non riesco a venirne a capo Perchè nella mia StoredProcedure ho anche un cursore e altre cose noiose che mi incasinano un po' tutto, e putroppo no riesco a integrare le due cose.

    Come ultimo slancio di speranza provo a postare qui la Stored Procedure originale in cui dovevo inserire la logica che richiedevo:

    codice:
    ALTER PROCEDURE dbo.spCreateTableType
    AS
    
    DECLARE @UserId int
    DECLARE @DataLogin datetime
    
    DECLARE @DataInizio datetime
    DECLARE @DataFine datetime
    DECLARE @NuovoIscritto datetime
    DECLARE @Mese int
    DECLARE @Anno int
    DECLARE @DataInizioStima datetime
    DECLARE @DataFineStima datetime
    
    SET @DataInizio = '2006-04-01'
    SET @DataFine = '2006-04-30'
    SET @NuovoIscritto = '01/03/2006'
    SET @Mese = 4
    SET @Anno = 2006
    SET @DataInizioStima = '2006-01-01'
    SET @DataFineStima = '2006-03-31'
    
    DELETE FROM dbo.TableType
    WHERE (Mese = @Mese) AND (Anno = @Anno)
    
    DECLARE DATE_LOGIN CURSOR FOR
    SELECT usrId,[Data Login]
    FROM dbo.EVO_UsersHistory
    WHERE [Data Login] BETWEEN @DataInizio AND @DataFine
    OPEN DATE_LOGIN
    
    FETCH NEXT FROM DATE_LOGIN
    INTO @UserId, @DataLogin
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    INSERT INTO [TableType] (UserId, Counter, UserType, Mese, Anno, AreaCommerciale, AnnoNascita, GruppoTBP, GruppoD2B, GruppoSeniorAccount, GruppoTeleAccount)
    SELECT @UserId,count(distinct dbo.EVO_UsersHistory.[Data Login]),
    CASE
    WHEN count(distinct dbo.EVO_UsersHistory.[Data Login]) > 0 AND dbo.EVO_Users.[Data iscrizione] > @NuovoIscritto THEN '1.Nuovo iscritto'
    WHEN count(distinct dbo.EVO_UsersHistory.[Data Login]) > 48 THEN '5.Super'
    WHEN count(distinct dbo.EVO_UsersHistory.[Data Login]) > 12 AND count(distinct dbo.EVO_UsersHistory.[Data Login]) <= 48 THEN '4.Normal'
    WHEN count(distinct dbo.EVO_UsersHistory.[Data Login]) > 1 AND count(distinct dbo.EVO_UsersHistory.[Data Login]) <= 12 THEN '3.Occasionale'
    WHEN count(distinct dbo.EVO_UsersHistory.[Data Login]) = 1 THEN '2.Sleeper'
    END,
    @Mese, @Anno,  dbo.EVO_Users.[Area Commerciale], YEAR(dbo.EVO_Users.[Data di Nascita]), dbo.EVO_Users.[Gruppo TBP], dbo.EVO_Users.[Gruppo D2B], dbo.EVO_Users.[Gruppo Senior Account], dbo.EVO_Users.[Gruppo Tele Account]
    FROM dbo.EVO_UsersHistory INNER JOIN  dbo.EVO_Users ON dbo.EVO_UsersHistory.usrId = dbo.EVO_Users.usrId
    WHERE [Data Login] BETWEEN @DataInizioStima AND @DataFineStima
    AND dbo.EVO_UsersHistory.usrId = @UserId AND (dbo.EVO_Users.[Abilitato al punteggio] = 'Abilitato') AND (dbo.EVO_Users.[Abilitato a ESms] = 'Abilitato') AND (dbo.EVO_Users.[Data cessazione] IS NULL OR dbo.EVO_Users.[Data cessazione] > @DataFine)
    GROUP BY dbo.EVO_UsersHistory.usrId, dbo.EVO_Users.[Data iscrizione], dbo.EVO_Users.[Area Commerciale], dbo.EVO_Users.[Data di Nascita], dbo.EVO_Users.[Gruppo TBP], dbo.EVO_Users.[Gruppo D2B], dbo.EVO_Users.[Gruppo Senior Account], dbo.EVO_Users.[Gruppo Tele Account]
    
    FETCH NEXT FROM DATE_LOGIN
    INTO @UserId, @DataLogin
    END
    
    SELECT * FROM [TableType]
    
    CLOSE DATE_LOGIN
    DEALLOCATE DATE_LOGIN
    E quella che ho provato a modificare come mi avevi indicato, che però purtroppo non riesco a far funzionare (ci sono un po' di casini con le sottoselect):

    codice:
    ALTER PROCEDURE dbo.spCreateTableType
    AS
    
    DECLARE @UserId int
    DECLARE @DataLogin datetime
    
    DECLARE @DataInizio datetime
    DECLARE @DataFine datetime
    DECLARE @NuovoIscritto datetime
    DECLARE @Mese int
    DECLARE @Anno int
    DECLARE @DataInizioStima datetime
    DECLARE @DataFineStima datetime
    
    SET @DataInizio = '2006-04-01'
    SET @DataFine = '2006-04-30'
    SET @NuovoIscritto = '01/03/2006'
    SET @Mese = 4
    SET @Anno = 2006
    SET @DataInizioStima = '2006-01-01'
    SET @DataFineStima = '2006-03-31'
    
    DELETE FROM dbo.TableType
    WHERE (Mese = @Mese) AND (Anno = @Anno)
    
    DECLARE DATE_LOGIN CURSOR FOR
    SELECT usrId,[Data Login]
    FROM dbo.EVO_UsersHistory
    WHERE [Data Login] BETWEEN @DataInizio AND @DataFine
    OPEN DATE_LOGIN
    
    FETCH NEXT FROM DATE_LOGIN
    INTO @UserId, @DataLogin
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    INSERT INTO [TableType] (UserId, Counter, UserType, Mese, Anno, AreaCommerciale, AnnoNascita, GruppoTBP, GruppoD2B, GruppoSeniorAccount, GruppoTeleAccount)
    SELECT Q.UserId,Q.Conteggio,
    CASE
    WHEN Q.Conteggio > 0 AND Q.DataIscrizione > @NuovoIscritto THEN '1.Nuovo iscritto'
    WHEN Q.Conteggio > 48 THEN '5.Super'
    WHEN (Q.Conteggio > 12 AND Q.Conteggio <= 48) AND (CDL15 > 2) AND (CDL3015 > 2) AND (CDL4530 > 2) THEN '4.Normal'
    WHEN Q.Conteggio > 1 AND Q.Conteggio <= 12 THEN '3.Occasionale'
    WHEN Q.Conteggio = 1 THEN '2.Sleeper'
    ELSE '3.Occasionale'
    END,
    @Mese, @Anno, Q.AC, Q.AnnoNascita, Q.TBP, Q.D2B, Q.Senior, Q.Tele
    
    FROM
    (
      SELECT @UserId AS UserId,count(distinct dbo.EVO_UsersHistory.[Data Login]) AS Conteggio, dbo.EVO_Users.[Data iscrizione] AS DataIscrizione, dbo.EVO_Users.[Area Commerciale] AS AC, YEAR(dbo.EVO_Users.[Data di Nascita]) AS AnnoNascita, dbo.EVO_Users.[Gruppo TBP] AS TBP, dbo.EVO_Users.[Gruppo D2B] AS D2B, dbo.EVO_Users.[Gruppo Senior Account] AS Senior, dbo.EVO_Users.[Gruppo Tele Account] AS Tele,
    	  (
    	   select count(distinct dbo.EVO_UsersHistory.[Data Login]) FROM dbo.EVO_UsersHistory
    	   where UserID=dbo.EVO_UsersHistory.UserID 
    	   and dbo.EVO_UsersHistory.[Data Login] BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio
    	  ) as CDL15,
    	
    	 (
    	  select count(distinct dbo.EVO_UsersHistory.[Data Login]) FROM dbo.EVO_UsersHistory
    	  where UserID=dbo.EVO_UsersHistory.UserID 
    	    and dbo.EVO_UsersHistory.[Data Login] BETWEEN DATEADD(day, -30, @DataInizio) AND DATEADD(day, -15, @DataInizio)
    	 ) as CDL3015,
    	
    	 (
    	  select count(distinct dbo.EVO_UsersHistory.[Data Login]) FROM dbo.EVO_UsersHistory.[Data Login]
    	  where UserID=dbo.EVO_UsersHistory.UserID 
    	   and  dbo.EVO_UsersHistory.[Data Login] BETWEEN DATEADD(day, -45, @DataInizio) AND DATEADD(day, -30, @DataInizio)
    	 ) as CDL4530
    
    	FROM dbo.EVO_UsersHistory INNER JOIN  dbo.EVO_Users ON dbo.EVO_UsersHistory.usrId = dbo.EVO_Users.usrId
    	WHERE [Data Login] BETWEEN @DataInizioStima AND @DataFineStima
    	AND dbo.EVO_UsersHistory.usrId = @UserId AND (dbo.EVO_Users.[Abilitato al punteggio] = 'Abilitato') AND (dbo.EVO_Users.[Abilitato a ESms] = 'Abilitato') AND (dbo.EVO_Users.[Data cessazione] IS NULL OR dbo.EVO_Users.[Data cessazione] > @DataFine)
    	GROUP BY dbo.EVO_UsersHistory.usrId, dbo.EVO_Users.[Data iscrizione], dbo.EVO_Users.[Area Commerciale], dbo.EVO_Users.[Data di Nascita], dbo.EVO_Users.[Gruppo TBP], dbo.EVO_Users.[Gruppo D2B], dbo.EVO_Users.[Gruppo Senior Account], dbo.EVO_Users.[Gruppo Tele Account]
    	
    ) AS Q
    
    FETCH NEXT FROM DATE_LOGIN
    INTO @UserId, @DataLogin
    END
    
    SELECT * FROM [TableType]
    
    CLOSE DATE_LOGIN
    DEALLOCATE DATE_LOGIN
    Non so se qualcuno è pratico di Stored Procedure, ma io purtroppo non riesco a far quadrare le cose

  6. #6
    Luogo
    Lazio
    Post
    1,720
    Blogs
    21
    Quote Originariamente inviato da Hamelin [FL]
    La logica mi sembra corretta, ma purtroppo devo gettare la spugna: devo inserirla in una Stored Procedure più complessa di SQL Server Reporting Services, e con tutte quelle sottoselect non riesco a venirne a capo Perchè nella mia StoredProcedure ho anche un cursore e altre cose noiose che mi incasinano un po' tutto, e putroppo no riesco a integrare le due cose.

    Anche se non conosco Reporting Services ,e visto che usi i cursori
    (anche se a occhio e croce potresti farne a meno velocizzando il tutto ) ,
    non penso che dovresti avere problemi
    a crearti una funzione fnGetTipoUserID() e fare una cosa tipo

    declare @tipo
    set @tipo=fnGetTipoUserID(...)

    insert into.... values(..... @tipo )
    Ultima modifica di sspintux; 28-04-2006 15:05 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  7. #7
    Luogo
    Lazio
    Post
    1,720
    Blogs
    21
    se ti serve ti ho preparato un esempio funzionanante
    che dovrebbe riprodurre la tua situazione anche se con
    qualche semplificazione di poco conto.

    (N.B. sicuramente dovrai aggiungere qualche parametro alla dbo.FnGetTipoUsr)

    ....fammi sapere

    Ciao

    codice:
    Use TempDb
    
    CREATE TABLE TabellaLogin
    ( UserId int,
    DataLogin datetime )
    go
    
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '01/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '02/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '03/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '04/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '05/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '06/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '07/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '08/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '09/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '10/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '11/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '12/01/2006')
    INSERT INTO TabellaLogin (UserId, DataLogin) VALUES (1, '01/03/2006')
    go
    
    -- funzione per determinare il tipo utente
    Create function dbo.FnGetTipoUsr(@UserId int ,@DataInizio datetime) 
    -- dovrai aggiungere ancora qualche parametro tipo datainizio e fine stima
    Returns varchar(15)
    
    AS
    
    BEGIN
    
    declare @sResult varchar(15)
    
     set @sResult =
     (
     Select 
           --Q.UserId, Q.Conteggio, 
    
           (CASE WHEN Conteggio > 48 THEN '5.Super'
             ELSE 
              CASE WHEN (Conteggio > 12 AND Conteggio <= 48)  
                         AND (CDL15 > 2) AND (CDL3015 > 2) AND (CDL4530 >2)
                    THEN '4.Normal'
                    ELSE '3.Occasionale'
             END
           END) AS TipoUsr
    
     FROM
     (
      SELECT UserId,count(distinct DataLogin) AS Conteggio,
      (
       select count(distinct DataLogin) FROM TabellaLogin
       where UserId=T.UserId  
       and DataLogin BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio
      ) as CDL15,
    
     (
      select count(distinct DataLogin) FROM TabellaLogin
      where UserId=T.UserId 
        and DataLogin BETWEEN DATEADD(day, -30, @DataInizio) AND DATEADD(day, -15, @DataInizio)
     ) as CDL3015,
    
     (
      select count(distinct DataLogin) FROM TabellaLogin
      where UserId=T.UserId 
       and  DataLogin BETWEEN DATEADD(day, -45, @DataInizio) AND DATEADD(day, -30, @DataInizio)
     ) as CDL4530
    
     FROM TabellaLogin T
     WHERE T.DataLogin BETWEEN '20060101' AND '20060301'
     group by UserId
     ) as q
    )
    
    return (@sResult)
    
    END -- fine funzione per determinare il tipo utente
    
    go
    
    -- tabella dei risulati
    create table dbo.TableType
    (
    UserID int,
    TipoUsr varchar(15),
    Counter int
    )
    
    go
    
    --- equivalente della tua sp
    
    declare @dt datetime
    declare @UserID int
    set @dt='20060301'
    declare @tipoUsr VArchar(10)
    
    set @userId=1
    insert into dbo.TableType(
     UserId,
     TipoUsr,
     Counter)
    select
     UserId,
     dbo.fnGetTipoUsr(UserID,@Dt),
     Count(Distinct datalogin)
    from dbo.TabellaLogin
    where UserId =1
    group by UserId 
    
    go
    
    --vedo
    select * from dbo.TableType
    
    go
    
    --pulizia
    drop function dbo.fnGetTipoUsr
    drop table dbo.TableType
    drop table dbo.TabellaLogin
    
    go
    Ultima modifica di sspintux; 01-05-2006 15:00 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  8. #8
    Hamelin [FL] non è in linea Novello
    Post
    24
    Essendo questa query inserita in una Stored Procedure piuttosto complessa (almeno per me :P ) ho qualche difficoltà a implementare soluzioni non semplici

    Mi hanno fornito però una soluzione alternativa, la seguente:

    codice:
    SELECT UserId,count(distinct DataLogin) AS Conteggio,
        CASE
            WHEN count(distinct DataLogin) > 48 THEN '5.Super'
            WHEN count(distinct DataLogin) > 12 
      	     AND count(distinct DataLogin) <= 48 
      	     AND (((select DataLogin from TabellaLogin where DataLogin BETWEEN '01/01/2006' AND '01/04/2006') BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio ) AND ( count(distinct DataLogin) > 2 ) )
      	     AND (((select DataLogin from TabellaLogin where DataLogin BETWEEN '01/01/2006' AND '01/04/2006') BETWEEN DATEADD(day, -30, @DataInizio) AND DATEADD(day, -15, @DataInizio)) AND (count(distinct DataLogin) > 2))
      	     AND (((select DataLogin from TabellaLogin where DataLogin BETWEEN '01/01/2006' AND '01/04/2006') BETWEEN DATEADD(day, -45, @DataInizio) AND DATEADD(day, -30, @DataInizio)) AND (count(distinct DataLogin) > 2))
            THEN '4.Normal'
            ELSE '3.Occasionale'
        END AS Tipo
    FROM TabellaLogin
    WHERE DataLogin BETWEEN '01/01/2006' AND '01/04/2006'
    GROUP BY UserId
    La quale, però, mi dà il seguente errore:

    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression

    Penso sia dovuto al fatto che stiamo dicendo
    CASE WHEN SELECT DataLogin
    che non gli piace molto... a logica, direi che si dovrebbe trasformare in qualcosa tipo

    CASE WHEN ... AND count(((select DataLogin from TabellaLogin where DataLogin BETWEEN '01/01/2006' AND '01/04/2006') BETWEEN DATEADD(day, -15, @DataInizio) AND @DataInizio )) > 2 ]

    Qualcuno avrebbe qualche idea di come poter rendere questa cosa in modo da utilizzare questa metodologia?

    Grazie ancora per l'attenzione

+ Rispondi al Thread

Discussioni simili

  1. Select distinct o group by su datatable
    Da temerario nel forum ASP 3.0, ASP .Net
    Risposte: 1
    Ultimo Post: 18-07-2005, 23:10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi