none
Invertire righe e colonne in una query RRS feed

  • Domanda

  • Ciao a tutti
    Spero di spiegare bene il mio problema.
    Una query ottenuta attraverso dei join mi restituisce questo:

    giorno | status | tariffa | camera | costo | n_camere
    17        | libera  | B&B     | singola  | 10       | 2
    17        | libera  | B&B     | doppia  | 15        | 2
    17        | libera  | B&B     | tripla     | 30        | 2
    18        | libera  | B&B     | singola  | 10        | 4
    18        | libera  | B&B     | doppia  | 15        | 4
    18        | libera  | B&B     | tripla     | 30        | 4
    ...

    Quello che vorrei ottenere è questo:
    colonna | 18     | 19     | ...
    status    | libera | libera | ...
    singola  | 10      | 10     | ...
    doppia   | 15      | 15    | ...
    tripla     | 30      | 30     | ...
    n_cam   | 2        | 4       | ...

    Oppure ottenere solo questo:
    colonna | 18     | 19     | ...
    singola  | 10      | 10     | ...
    doppia   | 15      | 15    | ...
    tripla     | 30      | 30     | ...

    Non conosco i giorni in partenza, ma sono dati dal risultato della query.
    E' possibile fare tutto questo con sql server? Ho cercato un pò è ho visto che posso ottenere questo con pivot, ma negli esempi trovati si conosce a priori il nome e il numero delle colonne (nel mio caso si conosce già i giorni).

    Vorrei approffondire sql server e la creazione di query complesse. Se si esclude msdn, chi può consigliarmi corsi online, libri, video corsi ecc?

    Grazie mile

    lunedì 17 febbraio 2014 10:25

Risposte

  • Ciao

    devi usare l'istruzione PIVOT come hai detto, ma dato che le colonne devono essere conosciute a priori, devi creare il costrutto dinamicamente.

    Un esempio.

    CREATE TABLE tblTemp 
    	(
         id int identity(1,1) primary key,
         giorno int, 
         status varchar(20), 
         tariffa varchar(30),
         camera varchar(30),
         costo decimal(10,2),
         n_camere int
        );
     
    INSERT INTO tblTemp
    (giorno,status,tariffa,camera,costo,n_camere)
    VALUES
    (17,'libera','B&B','singola',10,2),
    (17,'libera','B&B','doppia',15,2),
    (17,'libera','B&B','tripla',30,2),
    (18,'libera','B&B','singola',10,4),
    (18,'libera','B&B','doppia',15,4),
    (18,'libera','B&B','tripla',30,4),
    (19,'libera','B&B','singola',10,4),
    (19,'libera','B&B','doppia',15,4),
    (19,'libera','B&B','tripla',30,4);
    
    declare @giorni varchar(100)
    
    select @giorni = COALESCE(@giorni + ',' ,'') + 
    '[' + CAST(giorno as varchar(10)) + ']'
    from tblTemp
    group by giorno
    
    
    declare @str varchar(1000)
    
    set @str=
    'Select Camera, ' + @giorni + '
    from (select giorno, camera, costo
          from dbo.tblTemp) as t 
    PIVOT 
    (MIN(costo) 
     FOR giorno in (' + @giorni + ')
     ) as tblPvt'
    
    execute(@str)

    martedì 18 febbraio 2014 17:02