Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [SQL] errore group by

  1. #1

    [SQL] errore group by

    Ciao,
    ho una query come questa da lanciare su sql express

    SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY lc_note) as ct FROM table_name WHERE (lc_note!='')) SUB WHERE ct >=0 AND ct<=40 group by substring(lc_codart, 1, 3)

    ma non funziona, ricevo questo errore

    Msg 8120 (severity 16, state 1) from SERVER-NTS\SQLNTS Line 1:
    "Column 'SUB.ts' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

    SUB.ts è il primo cambo della tabella.

    Devo estrarre tutti i valori e raggrupare per le prime 3 cifre di lc_codart
    Dove sta l'errore?

    grazie.

  2. #2
    ma ti servono tutti i valori? estrai solo quelli che ti servono e ragiona su quelli

  3. #3
    Quote Originariamente inviata da optime Visualizza il messaggio
    ma ti servono tutti i valori? estrai solo quelli che ti servono e ragiona su quelli
    Si,ho provato anche estraendo un solo campo, ma l'errore è sempre quello, non ricevo errore solo se faccio questo:

    SELECT count(*) FROM (SELECT lc_codart,ROW_NUMBER() OVER (ORDER BY lc_note) as ct FROM table_name WHERE (lc_note!='')) SUB WHERE ct >=0 AND ct<=40 group by substring(lc_codart, 1, 3)

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Hai provato

    codice:
    SELECT substring(lc_codart, 1, 3), count(*) FROM (SELECT lc_codart,ROW_NUMBER() OVER (ORDER BY lc_note) as ct FROM table_name WHERE (lc_note!='')) SUB WHERE ct >=0 AND ct<=40 group by substring(lc_codart, 1, 3)
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    si, ma restituisce un record soltanto.
    Dopo qualche tentativi ho visto che questa query sembra funzionare

    SELECT * FROM (SELECT substring(lc_codart,1,3) AS codice,lc_codart,ar_descr,lc_note,ROW_NUMBER() OVER (ORDER BY lc_codart) as ct FROM table_name WHERE (lc_note!='') group by lc_note,lc_codart,ar_descr,substring(lc_codart,1,3 )) SUB WHERE ct >=0 AND ct<=40;

    ma non ho capito molto perché, io sono abituato con MySql e mi sembra tutto molto più semplice. Nel group by devo mettere tutti i campi che estraggo, altrimenti restituisce l'errore sopra.

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Se usi un group by devi avere gli stessi campi nella clausola select.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Se usi un group by devi avere gli stessi campi nella clausola select.
    però da quello che ho capito, non è possibile utilizzare * sul select e il group by, oppure sbaglio?

    un ultima domanda, ho utilizzato substring(lc_codart,1,3 ) per raggruppare le prime 3 lettere di quel campo, se invece volessi raggruppare per un campo che ha questo formato:
    123.00.00
    123.01.00
    123.03.00
    2356.06.99
    2356.06.00
    2356.06.993

    in pratica vorrei raggruppare fino al punto.

    grazie.

  8. #8
    usare * nella SELECT è già di per sé una bad practice. Con la GROUP BY poi è proprio concettualmente sbagliato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.