Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-03-2008, 18:17   #1
simoneart
Member
 
L'Avatar di simoneart
 
Iscritto dal: Aug 2003
Messaggi: 72
[SQL] Problema con raggruppamento

Salve a tutti, qualcuno saprebbe aiutarmi con questa query?
Codice:
SELECT TOP 5 ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio, ArtWC_MediaCatalogue.FileName, ArtWC_MediaCatalogue.Titolo
	FROM ArtWC_Eventi
	LEFT JOIN ArtWC_MediaLinks ON ArtWC_Eventi.ID_Evento = ArtWC_MediaLinks.ID_Item
	LEFT JOIN ArtWC_MediaCatalogue ON ArtWC_MediaLinks.ID_Media = ArtWC_MediaCatalogue.ID_Media
WHERE ArtWC_Eventi.DataInizio > GetDate() AND (ArtWC_MediaLinks.ID_ItemCategory = 2 OR ISNULL(ArtWC_MediaLinks.ID_ItemCategory,0) = 0)
GROUP BY ArtWC_Eventi.ID_Evento
ORDER BY ArtWC_Eventi.DataInizio DESC
La query gira su SQL Server 2005, funziona se tolgo la riga group by ma mi restituisce troppi risultati (mi ripete chiaramente un evento tante volte quanti sono i record collegati nella tabella MediaLinks). Aggiungendo l'istruzione group by mi restituisce l'errore:
Codice:
Column 'ArtWC_Eventi.Nome' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
Sapreste aiutarmi?
__________________
Visual Basic e dintorni Blog sullo sviluppo web

Ultima modifica di simoneart : 25-03-2008 alle 18:22.
simoneart è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2008, 20:06   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Nella select puoi selezionare solo gli attributi che metti nel group by o puoi attuare una funzione di aggregazione sugli attributi non presenti nel group by.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2008, 20:46   #3
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da cionci Guarda i messaggi
Nella select puoi selezionare solo gli attributi che metti nel group by o puoi attuare una funzione di aggregazione sugli attributi non presenti nel group by.
Confermo.

Ma cosa avresti voluto fare?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 09:53   #4
simoneart
Member
 
L'Avatar di simoneart
 
Iscritto dal: Aug 2003
Messaggi: 72
La teoria l'ho capita ma non la pratica... quale funzione di aggregazione posso usare per prendere solo il primo valore per ogni condizione soddisfatta? In Access mi pare fosse First() ma in t-sql non conosco l'equivalente.

La query dovrebbe funzionare così:
ho 3 tabelle, eventi, immagini e una tabella che lega immagini ed eventi.
Eventi, MediaCatalogue e MediaLinks.

Chiaramente ad ogni record nella tabella eventi (Evento) possono essere legate più immagini. Senza una funzione di raggruppamento, la query mi restituisce come risultato un elenco di eventi ma mi ripete ogni evento n volte quante sono le immagini collegate ad esso.

Invece avrei bisogno di elencare una sola volta ogni evento e portarmi appresso eventualmente una sola foto collegata.
__________________
Visual Basic e dintorni Blog sullo sviluppo web
simoneart è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 09:55   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
OK.
e quando invece per un dato evento le foto sono 2 (o piu'), cosa vorresti che venisse fuori?
Di quali colonne comunque hai bisogno, nel risultato finale?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:01   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da simoneart Guarda i messaggi
Invece avrei bisogno di elencare una sola volta ogni evento e portarmi appresso eventualmente una sola foto collegata.
Scusa, ma se hai fatto un Join perché ti dovrebbe portare tutte le fotografie ? E in con quale criterio dovresti scegliere la fotografia ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:05   #7
simoneart
Member
 
L'Avatar di simoneart
 
Iscritto dal: Aug 2003
Messaggi: 72
Quote:
Originariamente inviato da cionci Guarda i messaggi
Scusa, ma se hai fatto un Join perché ti dovrebbe portare tutte le fotografie ? E in con quale criterio dovresti scegliere la fotografia ?
Che domanda è? mi porta tutte le fotografie che rispettano la condizione del join. Eventi e foto sono legati attraverso i rispettivi id nella tabella medialinks.

In questa query non ho bisogno di elencare le foto, quando ne avrò bisogno farò una join tra medialinks e mediacatalogue dove l'id del legame che cerco è uguale all'evento (o altro elemento) che mi interessa
__________________
Visual Basic e dintorni Blog sullo sviluppo web
simoneart è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:07   #8
simoneart
Member
 
L'Avatar di simoneart
 
Iscritto dal: Aug 2003
Messaggi: 72
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
OK.
e quando invece per un dato evento le foto sono 2 (o piu'), cosa vorresti che venisse fuori?
Di quali colonne comunque hai bisogno, nel risultato finale?
Se le foto sono più di una, vorrei che comunque mi venisse listata solo la prima, le info di cui ho bisogno sono quelle elencate nella prima parte della select:
Codice:
SELECT TOP 5 ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio, ArtWC_MediaCatalogue.FileName, ArtWC_MediaCatalogue.Titolo
Quindi i dati base dell'evento più il percorso all'immagine e il titolo della stessa.
__________________
Visual Basic e dintorni Blog sullo sviluppo web
simoneart è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:16   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Allora il Join non ha senso: seleziona solo ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio dalla tabella eventi...no ?
Poi la foto te la selezioni a parte successivamente con l'ID Evento nel Where.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:22   #10
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da cionci Guarda i messaggi
Allora il Join non ha senso: seleziona solo ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio dalla tabella eventi...no ?
Poi la foto te la selezioni a parte successivamente con l'ID Evento nel Where.
Sono d'accordo.
Resta comunque l'ultima parte, che sarebbe:
Per ciascun evento, selezionare la foto piu' recente (o la piu' vecchia, o la piu' grossa. Boh? Solo "la prima" non ha senso detta cosi'. La prima se li avessi ordinati per???), con tutti i suoi dati a disposizione.

Poi tirare fuori tutto insieme oppure in 2 query separate sta poi a te.

Comunque per quest'ultima parte dovresti:
Una prima subquery per tirare fuori, per ciascun evento, quel e' il codice (PK) della foto interessata. (ovvero una subquery con GroupBy, e una funzione di gruppo tipo max)
Tale subquery andra' messa in join con la tabella dalle foto, per tirare fuori i dati interessati, per ciascuna foto.

Poi, se vorrai andare in join anche con la tabella degli eventi, per tirare fuori anche i dati interessanti per ciascun evento, quello stara' poi a te.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:34   #11
simoneart
Member
 
L'Avatar di simoneart
 
Iscritto dal: Aug 2003
Messaggi: 72
Non so se ho capito la vostra soluzione

A me serve (servirebbe) di ottenere quei dati con un'unica interrogazione. Vorrei ottenere come risultato un recordset del tipo:

ID_Evento | Titolo | Descrizione | Data | PercorsoFoto

In maniera tale da poter poi visualizzare i risultati con un semplice repeater.

Non conosco l'id dell'evento che sto estraendo e l'id dell'evento non è legato all'immagine se non attraverso la tabella dei links per cui non saprei come mettere un uguaglianza del tipo id_evento = id_item nel WHERE.

Per quanto riguarda le immagini, al momento non ha importanza l'ordine, mi basta tirarne fuori una qualsiasi.
__________________
Visual Basic e dintorni Blog sullo sviluppo web
simoneart è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 10:46   #12
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Una prima subquery per tirare fuori, per ciascun evento, quel e' il codice (PK) della foto interessata. (ovvero una subquery con GroupBy, e una funzione di gruppo tipo max)

Codice:
SELECT id_evento,max(id_media) maxmedia
FROM mediaLinks
GROUP BY id_evento
Tale subquery andra' messa in join con la tabella dalle foto, per tirare fuori i dati interessati, per ciascuna foto.

Codice:
SELECT pippo.id_evento,MediaCatalogue.* FROM
   (SELECT id_evento,max(id_media) maxmedia
           FROM mediaLinks
         GROUP BY id_evento) AS pippo
   JOIN MediaCatalogue ON (pippo.maxmedia=MediaCatalogue.id_media)
E se vuoi prendi a questo punto anche i dati degli eventi, che sono da prendere in outerjoin, poiche' e' possibile che un evento non abbia foto.

Codice:
SELECT * FROM Eventi
   LEFT OUTER JOIN 
    (tutta la sbrodolata di prima) AS menata
   ON (menata.id_evento = Eventi.id_evento)
E tutto questo perche' si vuole restare con il SQL Standard.
Con le funzioni analitiche di SQL-Server 2005+ la cosa e' piu' semplice (ma forse meno leggibile se non ci si e' abituati)

PS: Sbrodolata e' un termine tecnico, in uso anche in ambiente sistemistico, dove pero' si tende ad usare solo per i log-file.
Qui e' usata impropriamente, in quanto una Query inizia ad essere una sbrodolata quando ci vogliono almeno un paio di pagine per leggerla. A quel punto chi non usa le viste non ha capito molto cosa vuol dire manutenere il codice.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 26-03-2008 alle 10:48.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 15:09   #13
simoneart
Member
 
L'Avatar di simoneart
 
Iscritto dal: Aug 2003
Messaggi: 72
Grazie mille per la disponibilità e l'aiuto che mi avete dato
__________________
Visual Basic e dintorni Blog sullo sviluppo web
simoneart è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
Super El Niño, allarme globale: 451.000 ...
Toyota, 400.000 robot in fabbrica senza ...
Hanno bucato l'FBI e ora dettano le cond...
Standard sì, licenze no: la linea di Ope...
Guida all'acquisto: quale smartphone HON...
PS6 e nuova XBOX, i SoC avrebbero supera...
Alcuni frigoriferi smart di Samsung si a...
Italiani e IA, l'entusiasmo cala: avanti...
Robin Williams resuscitato dall'IA per p...
Acquista una RTX 5090 usata per risparmi...
CLOSEDQUORUM, il malware che usa quattro...
Microsoft: Calendar, People e Files vann...
Due missili su una scuola elementare ira...
Pirate Face è il Pirate Bay degli LLM: i...
ASUS ROG Azoth 96 HE: con gli switch mag...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v