Torna indietro   Hardware Upgrade Forum > Software > Programmazione

KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo
KTC lancia il nuovo monitor gaming H27E6, un modello da 27 pollici che promette prestazioni estreme grazie al pannello Fast IPS con risoluzione 2K QHD (2560x1440). Il monitor si posiziona come una scelta cruciale per gli appassionati di eSport e i professionisti creativi, combinando una frequenza di aggiornamento di 300Hz e un tempo di risposta di 1ms con un'eccezionale fedeltà cromatica
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-03-2008, 19: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 19:22.
simoneart è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2008, 21: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, 21: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, 10: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, 10: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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 11:48.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2008, 16: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


KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo KTC H27E6 a 300Hz e 1ms: come i rivali ma a met&...
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
GeForce RTX 50 SUPER cancellate o rimand...
Windows 11 si prepara a vibrare: Microso...
La “Burnout Season” colpisce l’Italia: i...
QNAP annuncia il JBOD TL-R6020Sep-RP: ol...
Siemens e NVIDIA uniscono le forze: arri...
Ricarica veloce e durata batteria: miti ...
Le "navi volanti" di Candela a...
Bambini su misura? Il caso della startup...
Iliad porta le SIM Express in edicola: r...
Offerte Amazon sui TV Mini LED Hisense 2...
Il silenzio digitale che fa male: come i...
Il responsabile del programma Cybertruck...
Domanda alle stelle per SSD e RAM: in Gi...
Zuckerberg vuole eliminare tutte le mala...
Otto suicidi, un solo chatbot: si moltip...
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: 21:26.


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