Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20

    [SQL Server] Query per estrarre valore da un campo non presente in un Group By

    Ciao, forse l'argomento è già stato trattato, però la mia necessità è un po' più specifica. Allora, io ho una tabella contenente le righe di vari ordini. La struttura è più o meno così:

    Riga Codice Quantita
    1 ABBB 2
    2 ACCC 5
    3 ACCC-SUFFIX 4


    La tabella si chiama TOD.
    Il numero dell'ordine preso in esame è 100.

    Il risultato voluto è questo:

    Riga Codice Quantita
    1 ABBB 2
    2 ACCC 9

    Fondamentalmente vorrei:
    1) le righe, i codici e le quantità ordinate, tenendo però in conto che occorre fare la somma delle quantità dei codici che, tolto il suffisso SUFFIX, risultano uguali (in effetti è lo stesso codice; il suffisso è stato un escamotage per altri motivi). E, in ques'ultimo caso, come numero di riga va preso quello del codice originale senza suffisso.

    Allora, se non mi servisse il numero di riga farei questa query:

    codice:
    SELECT replace(Codice,'-SUFFIX','') as Codice, SUM(Quantita) as Quantita FROM tod WHERE NumeroOrdine = 100 AND Quantità > 0 GROUP BY replace(Codice,'-SUFFIX','')

    però il numero di riga mi serve. Il problema è che il campo RIGA non è presente nel GROUP BY e la select mi andrebbe in errore. Per farla funzionare dovrei mettere il campo riga in una funzione di aggregazione (tipo MIN, MAX, AVG), in questo modo:

    codice:
    SELECT MIN(Riga) as Riga, replace(Codice,'-SUFFIX','') as Codice, SUM(Quantita) as Quantita FROM tod WHERE NumeroOrdine = 100 AND Quantità > 0 GROUP BY replace(Codice,'-SUFFIX','')


    Il problema è che non posso usare sempre MAX o MIN perché non so in partenza se il codice senza suffisso si trova prima o dopo di quello con suffisso. Nell'esempio di sopra funzionerebbe solo se il codice ACCC si trovasse sempre prima del codice ACCC-SUFFIX, però non è sempre così.

    Insomma non so come generare una query che vada bene in tutti i casi.

    Sapreste aiutarmi per favore?

    Grazie
    Ultima modifica di csar1992; 16-04-2014 a 15:50

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20
    Non ne vengo a capo. Immagino che vada fatta una sorta di ordinamento per codice (forse usando SELECT ROW_NUMBER()...) e poi estrarre la prima occorrenza della riga, ma non ci riesco.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20
    Trovata la soluzione da solo. Grazie.

  4. #4
    ----------------------------------------------------
    nello spirito del forum, spiega come hai fatto (postando la soluzione), così aiuterai qualche altro forumista che dovesse avere lo stesso problema.
    ------------------------------------------------------------------------

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20
    Nello spirito del forum, mi aspettavo un minimo di attenzione in più, visto che tutti sembrano dei geni, ma poi al dunque non risponde mai nessuno (e non è la prima volta). Però vabbè, non fa niente

    Comunque, alla fine ho fatto così. Non so se si possa fare meglio, ma questa query funziona

    codice:
    select replace(min(w.RigaDett),'0-','') as RigaOrdine,
     replace(w.Codice,'-SUFFIX','') as codice, 
     SUM(w.Quantita) as Quantita 
     from
    (select CASE WHEN CHARINDEX('-SUFFIX', codice)=0 THEN '0-'+min(cast(RIGA AS varchar)) ELSE '1-'+min(cast(RIGA AS varchar)) END as RigaDett,codice,SUM(Quantita) as Quantità
     from TOD 
     WHERE NumeroOrdine = 100
     AND Quantita > 0 
     group by Codice) w
     GROUP BY replace(w.Codice,'-SUFFIX','')
    order by RigaOrdine
    Ultima modifica di csar1992; 16-04-2014 a 23:23

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da csar1992 Visualizza il messaggio
    Nello spirito del forum, mi aspettavo ..........
    .............
    ........ Non so se si possa fare meglio, ..........
    Ma come sei impaziente dopo meno di 8 ore gia ti senti trascurato ....

    Io comunque la farei senza SottoQuery in questo modo:
    codice:
    SELECT     
    MAX(CASE WHEN RIGHT(Codice, 7) = '-SUFFIX' THEN - 1000 ELSE Riga END) AS Rig, 
    REPLACE(Codice, '-SUFFIX', '') AS Cod, 
    SUM(Quantita) AS SQu
    FROM   dbo.TOD
    WHERE     (NumeroOrdine = 100)
    GROUP BY REPLACE(Codice, '-SUFFIX', '')
    HAVING      (SUM(Quantita) > 0)
    Facci sapere
    Ultima modifica di nman; 17-04-2014 a 04:40

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20
    Ok. Funziona anche questa. Grazie
    Ultima modifica di csar1992; 17-04-2014 a 09:13

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20
    Rettifico dopo una serie di test. La tua query non funziona pienamente, perché quando c'è solo il codice con suffisso, e manca quello senza (non l'avevo specificato, ma può accadere), la riga dell'ordine che mi restituisce è - 1000. Infatti quel - 1000 non mi convinceva del tutto.
    La mia query invece funziona anche in questo caso, facendo un ulteriore replace sulla stringa '1-'.

  9. #9
    SELECT MIN(Riga), Codice, SUM(Quantita)
    FROM (SELECT Riga, REPLACE(Codice, '-SUFFIX', '') AS Codice, Quantita WHERE Ordine = 100) T1
    GROUP BY Codice

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2003
    Messaggi
    20
    Non va. Come detto, non so la posizione del codice con suffisso, se sta prima o dopo quello senza suffisso, o se si trova da solo. La tua query funziona solo se si trova prima.

Tag per questa discussione

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.