in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

[SQL] Errore di Group By su Select Case

Ultimo messaggio ricevuto il 05-05-2006 10.56 da devspy. 7 risposta(e).
Pagina 1 di 1 (8 elemento/i)
Ordina messaggi: Precedente Successivo
  • 28-04-2006 10.50

    [SQL] Errore di Group By su Select Case

    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:

    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:

    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

    • Log
  • 28-04-2006 16.42 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    Potresti provare ad utilizzare la formula CASE variabile WHEN valore THEN risultato ELSE NULL END.

    Forse questo articolo ti può aiutare: http://database.html.it/guide/lezione/2064/controllo-del-flusso-nel-tsql/ (osserva le varianti del costrutto CASE).

    • Log
  • 04-05-2006 10.56 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    Mi è stato detto che l'errore è dovuto al fatto che nella seconda query utilizzo DataLogin senza operatori di raggruppamento, e questo non è concesso, a meno di non riportare DataLogin nella clausola "GROUP BY" (cosa che, però, andrebbe contro la semantica dell'interrogazione).

    Mi hanno fornito una soluzione alternativa, la seguente:

    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

    • Log
  • 04-05-2006 13.44 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    In tal caso, temo che dovrai rinunciare al costrutto CASE WHEN perchè questa istruzione presuppone che il valore restituito (quello che segue la parola chiave WHEN) sia di tipo scalare, ovvero che restituisca un solo valore.
    • Log
  • 04-05-2006 14.58 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    Esattamente, è quello che vorrei io: cioè anzichè restituire al WHEN una lista di "DataLogin", come mi hanno (erroneamente) suggerito, mi restituisca un count(DataLogin) (e quindi uno scalare) e verifichi che questo count sia > 2

    Se si riuscisse a modificare il suggerimento in questo modo sarei a cavallo (ma purtroppo finora non sono riuscito)

    • Log
  • 05-05-2006 8.25 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    Probabilmente almeno una delle SELECT annidate che hai messo in AND restituisce più di un valore. Ti suggerisco, se non lo hai già fatto, di provare ad eseguirle singolarmente per verificare con esattezza quali valori restituiscono. Se riesci ad identificare l'istruzione "colpevole", lavori su quella fino ad ottenere la query che ti serve.
    • Log
  • 05-05-2006 9.21 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    Già, purtroppo tutte quante mi restituiscono più di un valore ^^"

    Dovrei modificarla in modo che le varie AND non abbiano un AND SELECT DataLogin, ma un AND count(DataLogin), ma purtroppo non riesco :(

    • Log
  • 05-05-2006 10.56 In risposta a

    Re: [SQL] Errore di Group By su Select Case

    Se l'elenco dei valori restituiti è costituito dalla stessa data ripetuta per ogni riga (dunque si tratta solo di una questione di selecione multipla ma con valore singolo), allora puoi usare l'istruzione SELECT TOP 1 DataLogin che ti consente di recuperare solo la prima riga.
    • Log
Pagina 1 di 1 (8 elemento/i)
Prelevato da http://www.devspy.com/forums/p/4154/4656.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"