Query tipo pivot su dati

di il
7 risposte

Query tipo pivot su dati

Buongiorno a tutti mi trovo in difficoltà

sto facendo una select su due tabelle per tirare giu' il dipendente e i periodi di assenza.
viene esposto con tanti record quanti sono i periodi, vorrei pero' fare si che
venga esposto solo un record per dipendente e i vari periodi messi in una colonna denominata periodo




SELECT DIPENDENTE.CODICEAZIENDA, DIPENDENTE.CODICEDIPENDENTE, DIPENDENTE.COGNOME, DIPENDENTE.NOME, DIPENDENTEASSENZE.CODICECAUSALE,
DIPENDENTEASSENZE.DAL, DIPENDENTEASSENZE.AL
FROM DIPENDENTE INNER JOIN
DIPENDENTEASSENZE ON DIPENDENTE.CODICEAZIENDA = DIPENDENTEASSENZE.CODICEAZIENDA AND DIPENDENTE.CODICEDIPENDENTE = DIPENDENTEASSENZE.CODICEDIPENDENTE



RISULTATO :

CODICEAZIENDA CODICEDIPENDENTE COGNOME NOME CAUSALE DAL AL

1603 1 ROSSI MARCO 301 29/10/2008 29/10/2008
1603 1 ROSSI MARCO 301 22/12/2008 07/01/2009
1603 1 ROSSI MARCO 301 27/03/2009 27/03/2009
1603 2 BIANCHI DAVIDE 301 09/04/2009 14/04/2009
1603 2 BIANCHI DAVIDE 301 11/05/2009 11/05/2009






MENTRE INVECE VORREI :

CODICEAZIENDA CODICEDIPENDENTE COGNOME NOME CAUSALE PERIODO1 PERIODO2 PERIODO3 PERIODO4 ECC....

1603 1 ROSSI MARCO 301 29/10/2008-29/10/2008 22/12/2008-07/01/2009 27/03/2009-27/03/2009
1603 2 BIANCHI DAVIDE 301 09/04/2009-14/04/2009 11/05/2009-11/05/2009



Grazie molte a tutti per l'aiuto

7 Risposte

  • Re: Query tipo pivot su dati

    Ciao,
    prova con la funzione PIVOT si Sql
    
    
    select *
    FROM 
    (
    	SELECT campo_costante1,campo_costante2,...,
    	FROM tabella
    	where xx=condizione 
    ) as s
    PIVOT
    (
    	max(campo contente il valore da inserire in colonna)
    	FOR colonna_pivot IN ([valore del record che diventarà colonna 1],[valore del record che diventarà colonna 2],[..])
    )AS p
    
    
    se nn capisci, cerco di farti un esempio pratico:-)
  • Re: Query tipo pivot su dati

    Ok se ha una email magari
    Grazie
  • Re: Query tipo pivot su dati

    Ciao,
    allora considera la tabella:
    
    DATARIF_PKEY	CODFISC				MODELLO	NDGGR				DOMANDA	RISPOSTA
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	010500	02
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	010900	01
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	011200	02
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	011400	02
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	011600	02
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	011700	05
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	011800	01
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	011900	01
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	013600	02
    2013-12-31		BAIDNL54L65L682C	02		0000000012960707	013700	02
    
    
    select *
    FROM
    (
       --campi costanti + campi su cui pivotizzi
       SELECT datarif_pkey,codfisc,RISPOSTA,DOMANDA
       FROM TR53_QUEDOM
       --where codfisc='BAIDNL54L65L682C'
    ) as s
    PIVOT
    (
       --campo che popolerà la colonna pivottata
       max(RISPOSTA)
       --valori da pivottare nella colonna
       FOR DOMANDA IN ([010500],[010900],[011200])
    )AS p
    
    risultato:
    
    datarif_pkey	codfisc				010500	010900	011200
    2013-12-31		BAIDNL54L65L682C	02		01		02
    
    spero che sia un po + chiaro ora.!
  • Re: Query tipo pivot su dati

    Ciao si , il risultato tuo é :
    datarif_pkey codfisc 010500 010900 011200
    2013-12-31 BAIDNL54L65L682C 02 01 02

    mentre io vorrei

    codfisc causale periodo1 periodo2
    BAIDNL54L65L682C SCIOPERO 2013-12-01/2013-12-01 2013-12-10/2013-12-15
    periodo3
    2013-12-20/2013-12-21

    in cui ho 31 campi periodo in cui posso avere i vari periodi siano essi dal giorno al giorno come un giorno solo oppure piu' giorni
  • Re: Query tipo pivot su dati

    Se questo è il tuo risultato:
    
    1603 1 ROSSI MARCO 301 29/10/2008 29/10/2008
    1603 1 ROSSI MARCO 301 22/12/2008 07/01/2009
    1603 1 ROSSI MARCO 301 27/03/2009 27/03/2009
    1603 2 BIANCHI DAVIDE 301 09/04/2009 14/04/2009
    1603 2 BIANCHI DAVIDE 301 11/05/2009 11/05/2009
    
    allora devi inserire una colonna dei periodi
    
    1603 1 ROSSI MARCO 301 periodo1 29/10/2008 29/10/2008
    1603 1 ROSSI MARCO 301 periodo2 22/12/2008 07/01/2009
    1603 1 ROSSI MARCO 301 periodo3 27/03/2009 27/03/2009
    1603 2 BIANCHI DAVIDE 301 periodo1 09/04/2009 14/04/2009
    1603 2 BIANCHI DAVIDE 301 periodo2 11/05/2009 11/05/2009
    
    così da poter far la pivot e avere i periodi in colonna...

    poi sinceramente nn capisco come sia organizzata la tua tabella...
    riesci a postare qlke record con tutte le colonne?!
  • Re: Query tipo pivot su dati

    La prima parte é la tabella di partenza la seconda é il risultato da ottenere.....


    CODAZI CODDIP COGNOME NOME CODCAU DAL AL DALLE ALLE
    1 1 ROSSI MARCO 301 19/09/2005 0.00 23/09/2005 0.00 0 0
    1 1 ROSSI MARCO 301 09/12/2005 0.00 09/12/2005 0.00 0 0
    1 4 BIANCHI FABIO 301 12/01/2004 0.00 16/01/2004 0.00 0 0
    1 4 BIANCHI FABIO 301 02/04/2004 0.00 02/04/2004 0.00 0 0
    1 4 BIANCHI FABIO 301 02/05/2004 0.00 10/05/2004 0.00 0 0


    COGNOME NOME CODCAU PERIODO1 PERIODO2 PERIODO 3
    ROSSI MARCO 301 19/09/2005 0.00 23/09/2005 0.00 09/12/2005 0.00 09/12/2005 0.00
    BIANCHI FABIO 301 12/01/2004 0.00 16/01/2004 0.00 02/04/2004 0.00 02/04/2004 0.00 02/05/2004 0.00 10/05/2004 0.00
  • Re: Query tipo pivot su dati

    Ok,
    ecco cosa devi fare:

    aggiungi alla tua tabella una colonna 'periodo' in cui definisci i periodi.
    (occhio..usa lo stessa sigla per tutti tipo p1,p2,pn...altrimenti fai un casino!)
    
    CODAZI	CODDIP	COGNOME	NOME	CODCAU	DAL	AL	DALLE	ALLE	periodo
    1	1	ROSSI	MARCO	301	19/09/2005	0.00	23/09/2005	0.00	p1
    1	1	ROSSI	MARCO	301	09/12/2005	0.00	09/12/2005	0.00	p2
    1	4	BIANCHI	FABIO	301	12/01/2004	0.00	16/01/2004	0.00	p1
    1	4	BIANCHI	FABIO	301	02/04/2004	0.00	02/04/2004	0.00	p2
    1	4	BIANCHI	FABIO	301	02/05/2004	0.00	10/05/2004	0.00	p3
    
    poi la query:
    
    select *
    FROM
    (
       --concateni per creare il periodo in un unica colonna...
       SELECT COGNOME,NOME,CODCAU,DAL+' '+AL+' '+DALLE+' '+alle as data,periodo
       FROM [pivot]
    ) as s
    PIVOT
    (
       max(data)
       FOR periodo IN ([p1],[p2],[p3])
    )AS p
    
    
    è qsto che intendevi?!
    COGNOME NOME CODCAU p1 p2 p3
    BIANCHI FABIO 301 12/01/2004 0.00 16/01/2004 0.00 02/04/2004 0.00 02/04/2004 0.00 02/05/2004 0.00 10/05/2004 0.00
    ROSSI MARCO 301 19/09/2005 0.00 23/09/2005 0.00 09/12/2005 0.00 09/12/2005 0.00 NULL
    poi ovviamente, se si, nel pezzo di codice FOR periodo IN ([p1],[p2],[p3]) dovresti o inresire a mano tutti i periodi o creare una query dinamica per popolarla (magari leggi da una tabella i periodi ncessari)

    altrimenti, più complessa se ti interessa avere separati i campi DAL, AL, DALLE, ALLE
    
    select t1.CODCAU,t1.COGNOME,t1.NOME,t1.p1,t2.p1,t1.p2,t2.p2,t1.p3,t2.p3 
    from
    (
    select *
    FROM
    (
       --concateni per creare il periodo in un unica colonna...
       SELECT COGNOME,NOME,CODCAU,DALLE+' '+alle as data,periodo
       FROM [pivot]
    ) as s
    PIVOT
    (
       max(data)
       FOR periodo IN ([p1],[p2],[p3])
    )AS p
    )t1
    join 
    (
    select *
    FROM
    (
       --concateni per creare il periodo in un unica colonna...
       SELECT COGNOME,NOME,CODCAU,DAL+' '+AL as data,periodo
       FROM [pivot]
    ) as s
    PIVOT
    (
       max(data)
       FOR periodo IN ([p1],[p2],[p3])
    )AS p
    )t2 on t1.CODCAU=t2.CODCAU
       and t1.COGNOME=t2.COGNOME
       and t1.NOME=t2.NOME
    
    
    CODCAU COGNOME NOME p1 p1 p2 p2 p3 p3
    301 BIANCHI FABIO 16/01/2004 0.00 12/01/2004 0.00 02/04/2004 0.00 02/04/2004 0.00 10/05/2004 0.00 02/05/2004 0.00
    301 ROSSI MARCO 23/09/2005 0.00 19/09/2005 0.00 09/12/2005 0.00 09/12/2005 0.00 NULL NULL
Devi accedere o registrarti per scrivere nel forum
7 risposte