[Sql] Query Pivot, senza funzione di aggregazione
-
- Scoppiettante Seguace
- Messaggi: 331
- Iscrizione: lunedì 23 luglio 2018, 19:22
- Desktop: Ubuntu Studio
- Distribuzione: Ubuntu Studio, Amd 64, 64 bit
- Sesso: Maschile
[Sql] Query Pivot, senza funzione di aggregazione
Buonasera, come da titolo, dovrei
Riportare le intestazioni Sulle colonne di una tabella sulle righe con una query.
Ho visto che questo in genere vien fatto tramite una Pivot che pero' obbliga l'uso Di una funzione d'aggregazione che a me non serve poiche' le Celle sono non numeriche.
Come posso generalmente implementare questo tipo Di query?
Cordialmente e buona serata.
Riportare le intestazioni Sulle colonne di una tabella sulle righe con una query.
Ho visto che questo in genere vien fatto tramite una Pivot che pero' obbliga l'uso Di una funzione d'aggregazione che a me non serve poiche' le Celle sono non numeriche.
Come posso generalmente implementare questo tipo Di query?
Cordialmente e buona serata.
- nuzzopippo
- Entusiasta Emergente
- Messaggi: 1627
- Iscrizione: giovedì 12 ottobre 2006, 11:34
Re: [Sql] Query Pivot, senza funzione di aggregazione
Di cosa stai parlando?
È oramai diverso tempo che non uso più database ma nella interrogazione diretta i nomi delle colonne vengono per lo più prodotti dagli interpreti con cui si eseguono le interrogazioni, in caso di utilizzo di funzioni di aggregazione vi sarebbe la clausola "AS nome_da_usare" inseribile nel SELECT, per altro, i drivers per i vari db di norma prevedono la possibilità di ottenere tali "intestazioni" o direttamente dai result-set od anche da metadati.
Precisa la natura del problema-
È oramai diverso tempo che non uso più database ma nella interrogazione diretta i nomi delle colonne vengono per lo più prodotti dagli interpreti con cui si eseguono le interrogazioni, in caso di utilizzo di funzioni di aggregazione vi sarebbe la clausola "AS nome_da_usare" inseribile nel SELECT, per altro, i drivers per i vari db di norma prevedono la possibilità di ottenere tali "intestazioni" o direttamente dai result-set od anche da metadati.
Precisa la natura del problema-
Fatti non foste a viver come bruti ...
-
- Scoppiettante Seguace
- Messaggi: 331
- Iscrizione: lunedì 23 luglio 2018, 19:22
- Desktop: Ubuntu Studio
- Distribuzione: Ubuntu Studio, Amd 64, 64 bit
- Sesso: Maschile
Re: [Sql] Query Pivot, senza funzione di aggregazione
In Sostanza devo riportare le colonne sulle righe, perche loutput altrimenti so ripete sulle colonne
- nuzzopippo
- Entusiasta Emergente
- Messaggi: 1627
- Iscrizione: giovedì 12 ottobre 2006, 11:34
Re: [Sql] Query Pivot, senza funzione di aggregazione
Onestamente, ancora non ho compreso cosa dovresti fare e con che ... cerco di farTi un esempio per esplicitare le mie perplessità, creiamo un database postgresql in cui definiamo una tavola "nomi" con le colonne "cognome", "nome" ed "eta", inseriamo dei nominativi e facciamoci una interrogazione
Codice: Seleziona tutto
NzP:~$ createdb tests
NzP:~$ psql tests
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1), server 12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
Type "help" for help.
tests=> CREATE TABLE nomi (
tests(> cognome TEXT NOT NULL,
tests(> nome TEXT NOT NULL,
tests(> eta SMALLINT)
tests-> ;
CREATE TABLE
tests=> INSERT INTO NOMI VALUES('De Paperoni', 'Paperone', 101);
INSERT 0 1
tests=> INSERT INTO NOMI VALUES('Paolino', 'Paperino', 50);
INSERT 0 1
tests=> INSERT INTO NOMI VALUES('Paperone', 'Gastone', 49);
INSERT 0 1
tests=> SELECT * FROM nomi;
cognome | nome | eta
-------------+----------+-----
De Paperoni | Paperone | 101
Paolino | Paperino | 50
Paperone | Gastone | 49
(3 rows)
tests=>
Leggermente diversa è la faccenda se si rilevano i dati in un ambiente di sviluppo, in tal caso i dati non sono "direttamente" associati a dette etichette ma, in genere, è discorso semplice associarli, Ti faccio un esempio sulla stessa base dati interrogandola con python
Codice: Seleziona tutto
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
import psycopg
def to_print(curr): # funzione per stampa resultset con etichette
labels = [x[0] for x in curr.description]
for l in labels:
print(f'{l:<20}', end='')
print()
rows = curr.fetchall()
for r in rows:
for v in r:
print(f'{v:<20}', end='')
print()
connstr = "dbname='tests' host='localhost' port='5432' user='***' password='***'"
conn = psycopg.connect(connstr)
query = 'SELECT * FROM nomi'
curr = conn.cursor()
curr.execute(query)
<psycopg.Cursor [TUPLES_OK] [INTRANS] (host=localhost user=*** database=tests) at 0x7fb6faaa4f60>
to_print(curr)
cognome nome eta
De Paperoni Paperone 101
Paolino Paperino 50
Paperone Gastone 49
Ora, la domanda torna ad essere : cosa devi fare e con che?, ed a quale fine?
Ultima modifica di nuzzopippo il domenica 16 aprile 2023, 16:20, modificato 1 volta in totale.
Fatti non foste a viver come bruti ...
-
- Scoppiettante Seguace
- Messaggi: 857
- Iscrizione: domenica 7 luglio 2013, 15:55
- Desktop: GNU/Linux
- Distribuzione: Ubuntu 22.04.2 LTS
- Sesso: Maschile
Re: [Sql] Query Pivot, senza funzione di aggregazione
provo a postare un esempio completo per favore con l'output desiderato perchè altrimenti non si riesce a comprendere la natura del problema
-
- Scoppiettante Seguace
- Messaggi: 331
- Iscrizione: lunedì 23 luglio 2018, 19:22
- Desktop: Ubuntu Studio
- Distribuzione: Ubuntu Studio, Amd 64, 64 bit
- Sesso: Maschile
Re: [Sql] Query Pivot, senza funzione di aggregazione
Semplicemente devo fare una query che faccia questo:
Cliente|Ordini|Numero_Ordini
-------------------------------------------
Cliente1 Ordine1 Ordine2 ordine3 3
Cliente2 Ordine4 Ordine5 2
Cliente3 Ordine6 Ordine7 Ordine8 3
Siccome gli ordini variano per clienti non posso elencarli su una colonna.
Cliente|Ordini|Numero_Ordini
-------------------------------------------
Cliente1 Ordine1 Ordine2 ordine3 3
Cliente2 Ordine4 Ordine5 2
Cliente3 Ordine6 Ordine7 Ordine8 3
Siccome gli ordini variano per clienti non posso elencarli su una colonna.
-
- Scoppiettante Seguace
- Messaggi: 331
- Iscrizione: lunedì 23 luglio 2018, 19:22
- Desktop: Ubuntu Studio
- Distribuzione: Ubuntu Studio, Amd 64, 64 bit
- Sesso: Maschile
Re: [Sql] Query Pivot, senza funzione di aggregazione
Ciao e Grazie, ripensadoci, posso ovviamente rappresentare gli ordini anche sulle colonne a patto di restituire dei null dove non vi sono ordini.nuzzopippo ha scritto: ↑domenica 16 aprile 2023, 16:06Onestamente, ancora non ho compreso cosa dovresti fare e con che ... cerco di farTi un esempio per esplicitare le mie perplessità, creiamo un database postgresql in cui definiamo una tavola "nomi" con le colonne "cognome", "nome" ed "eta", inseriamo dei nominativi e facciamoci una interrogazioneCome puoi vedere dall'output della query, le "intestazioni" delle colonne dati vengono automaticamente inserite dall'interprete dei comandi psql; questo è il comportamento normale di un qualsiasi processo che si interfacci ad un end-user, a suo tempo ho constatato che anche eseguendo query in fogli elettronici od altro si provvedeva ad accorgimenti del genere.Codice: Seleziona tutto
NzP:~$ createdb tests NzP:~$ psql tests psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1), server 12.12 (Ubuntu 12.12-0ubuntu0.20.04.1)) Type "help" for help. tests=> CREATE TABLE nomi ( tests(> cognome TEXT NOT NULL, tests(> nome TEXT NOT NULL, tests(> eta SMALLINT) tests-> ; CREATE TABLE tests=> INSERT INTO NOMI VALUES('De Paperoni', 'Paperone', 101); INSERT 0 1 tests=> INSERT INTO NOMI VALUES('Paolino', 'Paperino', 50); INSERT 0 1 tests=> INSERT INTO NOMI VALUES('Paperone', 'Gastone', 49); INSERT 0 1 tests=> SELECT * FROM nomi; cognome | nome | eta -------------+----------+----- De Paperoni | Paperone | 101 Paolino | Paperino | 50 Paperone | Gastone | 49 (3 rows) tests=>
Leggermente diversa è la faccenda se si rilevano i dati in un ambiente di sviluppo, in tal caso i dati non sono "direttamente" associati a dette etichette ma, in genere, è discorso semplice associarli, Ti faccio un esempio sulla stessa base dati interrogandola con pythonCome puoi rilevare dal codice (eseguito direttamente in una shell IDLE) ho preparato una semplice funzione di stampa che estrae le "intestazioni" (nomi di colonna in questo caso) dati metadati del resultset e quindi stampa etichette e dati giustificandoli a sinistra di spazi da 20 caratteri. ... certo, in altri ambienti/linguaggi le cose possono essere leggermente diverse ma non di molto.Codice: Seleziona tutto
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux Type "help", "copyright", "credits" or "license()" for more information. import psycopg def to_print(curr): # funzione per stampa resultset con etichette labels = [x[0] for x in curr.description] for l in labels: print(f'{l:<20}', end='') print() rows = curr.fetchall() for r in rows: for v in r: print(f'{v:<20}', end='') print() connstr = "dbname='tests' host='localhost' port='5432' user='***' password='***'" conn = psycopg.connect(connstr) query = 'SELECT * FROM nomi' curr = conn.cursor() curr.execute(query) <psycopg.Cursor [TUPLES_OK] [INTRANS] (host=localhost user=*** database=tests) at 0x7fb6faaa4f60> to_print(curr) cognome nome eta De Paperoni Paperone 101 Paolino Paperino 50 Paperone Gastone 49
Ora, la domanda torna ad essere : cosa devi fare e con che?, ed a quale fine?
-
- Scoppiettante Seguace
- Messaggi: 371
- Iscrizione: venerdì 10 dicembre 2021, 18:33
- Desktop: fvwm
- Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
- Sesso: Maschile
- Località: Paneropoli
Re: [Sql] Query Pivot, senza funzione di aggregazione
Sarebbe accettabile una cosa come questa
Cliente1 1 Ordine1
Cliente1 2 Ordine2
Cliente1 3 Ordine3
Cliente2 1 Ordine4
Cliente2 2 Ordine5
Cliente3 1 Ordine6
Cliente3 2 Ordine7
Cliente3 3 Ordine8
In mysql/MariaDB saprei farlo (anche se nell'esempio specifico non capisco se si tratta di una sola tabella o piu'tabelle in join ... io di solito faccio altri usi di DB (astronomici) ... la cosa "difficile" e' avere il contatore parziale che si resetta al cambio di cliente ... di solito lo faccio usando una variabile @ e una tabella temporanea ... di solito lo faccio p.es. per flaggare keep/delete la piu' vicina tra n entries relative a un oggetto
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
- nuzzopippo
- Entusiasta Emergente
- Messaggi: 1627
- Iscrizione: giovedì 12 ottobre 2006, 11:34
Re: [Sql] Query Pivot, senza funzione di aggregazione
@Lucio c tocca un argomento che sin ora è rimasto sospeso, anche in PostgreSQL potrebbe essere fatto o potrebbero, anche, essere utilizzate delle viste intermedie, ma il discorso comincia a diventare specifico per il singolo database dato che può coinvolgere funzioni o dialetti propri al di fuori dello ANSI SQL, se non proprio delle stored procedure.
Lo OP non ha, tutt'ora, indicato di cosa si parla in merito al database ed indicato se lo "SQL" debba essere inteso quale ANSI o meno, da utilizzarsi a livello di gestori di default di server dati tipo "psql" di postgres, "pl/sql" di oracle, etc., ovvero essere utilizzato all'interno di proprio codice o altro.
Il discorso è complesso ed ampio, ci si perde se non si è specifici in merito a ciò che si chiede.
Fatti non foste a viver come bruti ...
-
- Scoppiettante Seguace
- Messaggi: 371
- Iscrizione: venerdì 10 dicembre 2021, 18:33
- Desktop: fvwm
- Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
- Sesso: Maschile
- Località: Paneropoli
Re: [Sql] Query Pivot, senza funzione di aggregazione
Sinceramente ignoro quanto i vari "dialetti" di SQL siano diversi.
Io di solito uso un trucco di questo tipo, dove tabella e' la tabella di partenza (puo' anche essere una serie di left join), colx e' una colonna che identifica l'oggetto individuale, le altre colonne othercol sono dei parametri ... potrebbe essere la distanza nel cielo da un altro oggetto, o la probabilita' o likelihood di associazione, o altro ... in ogni caso per ogni oggetto individuale ci sono una o piu' entries di cui va scelta quella con la minor distanza, la miglior probabilita' ecc.
Questo dovrebbe assegnare un "rango d'ordine" (1,2,3...) per ognuna delle entries associate a un dato oggetto individuale. Altre volte mi limito a assegnare un flag "keep" o "delete" ... tenendo il primo e ignorando tutte le successive.
Poi con un join tra tt e tabella estraggo o ripulisco quanto mi interessa. E non copio le variabili/colonna @r e @s.
Spesso lo faccio banalmente eseguendo una sequenza di comandi sql a mano, cut and paste da file, o redirect da stdin. Rarissimamente stored procedures.
Se voglio vedere un output fancy, script csh che invoca sql con redirect da stdin e stdout pipato un un awk che mi genera un file html (che, so , ho un elenco storico dei laureandi dell'istituto con in blu quelli passati e in nero quelli attivi).
Io di solito uso un trucco di questo tipo, dove tabella e' la tabella di partenza (puo' anche essere una serie di left join), colx e' una colonna che identifica l'oggetto individuale, le altre colonne othercol sono dei parametri ... potrebbe essere la distanza nel cielo da un altro oggetto, o la probabilita' o likelihood di associazione, o altro ... in ogni caso per ogni oggetto individuale ci sono una o piu' entries di cui va scelta quella con la minor distanza, la miglior probabilita' ecc.
Codice: Seleziona tutto
create temporary table t select ....,colx,.... from tabella order by colx,othercol;
set @s:=600049; /*primo valore di colx */
set @r:=0;
create temporary table tt select ... @r:=@r+if(@s=colx,1,1-@r) as rank,@s:=colx from t where .... order by colx,othercol;
Poi con un join tra tt e tabella estraggo o ripulisco quanto mi interessa. E non copio le variabili/colonna @r e @s.
Spesso lo faccio banalmente eseguendo una sequenza di comandi sql a mano, cut and paste da file, o redirect da stdin. Rarissimamente stored procedures.
Se voglio vedere un output fancy, script csh che invoca sql con redirect da stdin e stdout pipato un un awk che mi genera un file html (che, so , ho un elenco storico dei laureandi dell'istituto con in blu quelli passati e in nero quelli attivi).
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
-
- Scoppiettante Seguace
- Messaggi: 331
- Iscrizione: lunedì 23 luglio 2018, 19:22
- Desktop: Ubuntu Studio
- Distribuzione: Ubuntu Studio, Amd 64, 64 bit
- Sesso: Maschile
Re: [Sql] Query Pivot, senza funzione di aggregazione
NO purtoppo: Non è accettabile...Lucio C ha scritto: ↑domenica 16 aprile 2023, 21:40Sarebbe accettabile una cosa come questa
Cliente1 1 Ordine1
Cliente1 2 Ordine2
Cliente1 3 Ordine3
Cliente2 1 Ordine4
Cliente2 2 Ordine5
Cliente3 1 Ordine6
Cliente3 2 Ordine7
Cliente3 3 Ordine8
In mysql/MariaDB saprei farlo (anche se nell'esempio specifico non capisco se si tratta di una sola tabella o piu'tabelle in join ... io di solito faccio altri usi di DB (astronomici) ... la cosa "difficile" e' avere il contatore parziale che si resetta al cambio di cliente ... di solito lo faccio usando una variabile @ e una tabella temporanea ... di solito lo faccio p.es. per flaggare keep/delete la piu' vicina tra n entries relative a un oggetto
- tokijin
- Moderatore Globale
- Messaggi: 4610
- Iscrizione: mercoledì 3 giugno 2009, 23:10
- Desktop: plasma 5.27.4
- Distribuzione: Kubuntu 23.04
- Località: Abruzzo
Re: [Sql] Query Pivot, senza funzione di aggregazione
Su Redshift userei LISTAGG per la lista degli ordini e un count raggruppato per cliente per avere il numero di ordini.
Non so se nel linguaggio utilizzato da ldvubuntu ci sia una funzione simile a listagg.
Non so se nel linguaggio utilizzato da ldvubuntu ci sia una funzione simile a listagg.
Sei abbruzzese se dopo che ti sei strafogato un chilogrammo di pasta, hai il coraggio di dire alla cuoca "cacc ch'è cott" - Se entra un piccione in casa..chiudi le finestre!
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
- Rafbor
- Prode Principiante
- Messaggi: 143
- Iscrizione: domenica 13 febbraio 2022, 18:22
- Desktop: Xubuntu
- Distribuzione: 22.04.3 LTS
- Località: Francia
Re: [Sql] Query Pivot, senza funzione di aggregazione
Per concatenare i numeri d'ordine sulla stessa riga, esiste GROUP_CONCAT.
PS: non è una buona idea concatenare i numeri degli ordini sulla stessa riga; immaginiamo un cliente con centinaia di ordini, si raggiungerà rapidamente il limite di caratteri consentito.
PS: non è una buona idea concatenare i numeri degli ordini sulla stessa riga; immaginiamo un cliente con centinaia di ordini, si raggiungerà rapidamente il limite di caratteri consentito.
-
- Scoppiettante Seguace
- Messaggi: 331
- Iscrizione: lunedì 23 luglio 2018, 19:22
- Desktop: Ubuntu Studio
- Distribuzione: Ubuntu Studio, Amd 64, 64 bit
- Sesso: Maschile
Re: [Sql] Query Pivot, senza funzione di aggregazione
Su Sql Management non funziona "GROUP_CONCAT", per il resto è vero ma basta imporre una WHERE per limitare il numero di ordini da vedere.Rafbor ha scritto: ↑lunedì 17 aprile 2023, 15:22Per concatenare i numeri d'ordine sulla stessa riga, esiste GROUP_CONCAT.
PS: non è una buona idea concatenare i numeri degli ordini sulla stessa riga; immaginiamo un cliente con centinaia di ordini, si raggiungerà rapidamente il limite di caratteri consentito.
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 8 ospiti