[Sql] Query Pivot, senza funzione di aggregazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
ldvubuntu
Scoppiettante Seguace
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

Messaggio da ldvubuntu »

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.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1623
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Sql] Query Pivot, senza funzione di aggregazione

Messaggio da nuzzopippo »

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-
Fatti non foste a viver come bruti ...
ldvubuntu
Scoppiettante Seguace
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

Messaggio da ldvubuntu »

In Sostanza devo riportare le colonne sulle righe, perche loutput altrimenti so ripete sulle colonne
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1623
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Sql] Query Pivot, senza funzione di aggregazione

Messaggio da nuzzopippo »

ldvubuntu ha scritto:
domenica 16 aprile 2023, 13:08
In Sostanza devo riportare le colonne sulle righe, perche loutput altrimenti so ripete sulle colonne
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=> 
Come 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.

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                  
Come 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.

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 ...
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 852
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

Messaggio da TommyB1992 »

provo a postare un esempio completo per favore con l'output desiderato perchè altrimenti non si riesce a comprendere la natura del problema
ldvubuntu
Scoppiettante Seguace
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

Messaggio da ldvubuntu »

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.
ldvubuntu
Scoppiettante Seguace
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

Messaggio da ldvubuntu »

nuzzopippo ha scritto:
domenica 16 aprile 2023, 16:06
ldvubuntu ha scritto:
domenica 16 aprile 2023, 13:08
In Sostanza devo riportare le colonne sulle righe, perche loutput altrimenti so ripete sulle colonne
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=> 
Come 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.

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                  
Come 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.

Ora, la domanda torna ad essere : cosa devi fare e con che?, ed a quale fine?
Ciao e Grazie, ripensadoci, posso ovviamente rappresentare gli ordini anche sulle colonne a patto di restituire dei null dove non vi sono ordini.
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
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

Messaggio da Lucio C »

ldvubuntu ha scritto:
domenica 16 aprile 2023, 17:36
Cliente1 Ordine1 Ordine2 ordine3 3
Cliente2 Ordine4 Ordine5 2
Cliente3 Ordine6 Ordine7 Ordine8 3
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)
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1623
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Sql] Query Pivot, senza funzione di aggregazione

Messaggio da nuzzopippo »

Lucio C ha scritto:
domenica 16 aprile 2023, 21:40
...In mysql/MariaDB saprei farlo (anche se nell'esempio specifico non capisco se si tratta di una sola tabella o piu'tabelle in join ...
@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 ...
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
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

Messaggio da Lucio C »

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.

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;
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).
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)
ldvubuntu
Scoppiettante Seguace
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

Messaggio da ldvubuntu »

Lucio C ha scritto:
domenica 16 aprile 2023, 21:40
ldvubuntu ha scritto:
domenica 16 aprile 2023, 17:36
Cliente1 Ordine1 Ordine2 ordine3 3
Cliente2 Ordine4 Ordine5 2
Cliente3 Ordine6 Ordine7 Ordine8 3
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
NO purtoppo: Non è accettabile...
Avatar utente
tokijin
Moderatore Globale
Moderatore Globale
Messaggi: 4606
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

Messaggio da tokijin »

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.
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
Avatar utente
Rafbor
Prode Principiante
Messaggi: 142
Iscrizione: domenica 13 febbraio 2022, 18:22
Desktop: Xubuntu
Distribuzione: 22.04.3 LTS
Località: Francia

Re: [Sql] Query Pivot, senza funzione di aggregazione

Messaggio da Rafbor »

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.
ldvubuntu
Scoppiettante Seguace
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

Messaggio da ldvubuntu »

Rafbor ha scritto:
lunedì 17 aprile 2023, 15:22
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.
Su Sql Management non funziona "GROUP_CONCAT", per il resto è vero ma basta imporre una WHERE per limitare il numero di ordini da vedere.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 14 ospiti