in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

creare un matrice di dati in sql

Last post 06-19-2008 19.37 by dmauri. 5 replies.
Page 1 of 1 (6 items)
Sort Posts: Previous Next
  • 05-16-2008 18.48

    • rob
    • Top 25 Contributor
    • Joined on 06-04-2007
    • Posts 61
    • Points 1.085

    creare un matrice di dati in sql

     salve

     ho un tabella nomi con: id, nome, descrizione,via idtipo

     la tabella id tipo ha: idtipo, nome

     io vorrei un recordset che ha come colonne tutti i record della tabella tipo e come righe i valori della nomi ad esempio:

    tipo1--tipo2--tipo2
    marco--studente--via f.ciusa
    giuseppe--studente--via roma

     

    etc.

    è fattiible realizzare una cos del genere

    ????
     

    • Post Points: 20
  • 05-16-2008 19.09 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: creare un matrice di dati in sql

    Si certo, devi utilizzare la funzione PIVOT (SQL 2005).

    Se posti del codice di esempio delle tue tabelle con anche alcuni dati di prova (posta le insert) è molto semplice fare uno script che fa quello che ti serve.

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 05-16-2008 19.39 In reply to

    • rob
    • Top 25 Contributor
    • Joined on 06-04-2007
    • Posts 61
    • Points 1.085

    Re: creare un matrice di dati in sql

    Ok è questo:

    CREATE TABLE [dbo].[tabColonne](
        [idMacroSettoreEconomico] [int] NOT NULL,
        [denominazione] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL
    )

    INSERT INTO [dbo].[tabColonne] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 1,tipo1)
    INSERT INTO [dbo].[tabColonne] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 2,tipo2)
    INSERT INTO [dbo].[tabColonne] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 3,tipo3)

    CREATE TABLE [dbo].[tab1](
        [idTab1] [int] NOT NULL,
        [idMacroSettoreEconomico] [char](10) COLLATE Latin1_General_CI_AS NOT NULL,
        [anno] [int] NOT NULL,
        [addetti] [int] NOT NULL,
        [nome] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL
     
    )

    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 1,1,2006,10,marco)
    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 2,2,2005,30,marco)
    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 3,3,2004,20,marco)

    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 4,1,2006,10,luca)
    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 5,2,2005,30,luca)
    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 6,3,2004,20,luca)

    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 7,1,2006,10,rosi)
    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 8,2,2005,30,rosi)
    INSERT INTO [dbo].[tab1] ([idMacroSettoreEconomico] ,[denominazione])    VALUES( 9,3,2004,20,rosi)


     

    Una cosa del genere

    nome--tipo1--tipo2--tipo3
    marco   10       20      30
    luca      10       20      30
    rosi       10       20      30


     

     

    • Post Points: 20
  • 05-17-2008 21.25 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: creare un matrice di dati in sql

    Questo un esempio di come risolvere il problema:

    with cte as
    (
    select
     t.[idTab1],
     t.[idMacroSettoreEconomico],
     t.[anno],
     t.[addetti],
     t.[nome],
     tc.[denominazione]
    from
     [dbo].[tab1] as t
    inner join
     [dbo].[tabColonne] as tc on t.[idMacroSettoreEconomico] = tc.[idMacroSettoreEconomico]
    )
    select
     nome,
     tipo1 = sum(tipo1),
     tipo2 = sum(tipo2),
     tipo3 = sum(tipo3)
    from
     cte
    pivot
     (sum(addetti) for denominazione in (tipo1, tipo2, tipo3)) as pvt
    group by
     nome
     

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 06-17-2008 9.29 In reply to

    • rob
    • Top 25 Contributor
    • Joined on 06-04-2007
    • Posts 61
    • Points 1.085

    Re: creare un matrice di dati in sql

    Il problema e che i miei capi tipo1,tipo2,tipo3 andrebbero presi da un'altra  tabella....

    • Post Points: 20
  • 06-19-2008 19.37 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: creare un matrice di dati in sql

    Beh, ti basta quindi creare la query al volo e quindi eseguirla:

    /*

     Implementazione Pivot dinamica

    */

    -- Crea una stringa di valori separati da virgola
    -- che contiene i nomi dei valori da pivotare (ossia da trasformare in colonne)
    declare @s varchar(max);
    set @s = '';
    with cte as (
     select distinct [denominazione] from dbo.tabColonne s
    )
    select @s = @s + [denominazione] + ',' from cte;
    set @s = substring(@s, 1, len(@s)-1);

    -- Esegue la query con un pivoting dinamico
    -- Esegue la query con un pivoting dinamico
    declare @q nvarchar(max);
    set @q = N'
     with    cte
              as ( select                         
                            t.[addetti],
                            t.[nome],
                            tc.[denominazione]
                   from     [dbo].[tab1] as t
                            inner join [dbo].[tabColonne] as tc on t.[idMacroSettoreEconomico] = tc.[idMacroSettoreEconomico]
                 )
        select 
      *
        from
      cte pivot ( sum(addetti) for denominazione in ( ' + @s + ' ) ) as pvt'
    exec sp_executesql @q;
    go


    Per i posteri, visto che la domanda si ripropone frequentemente, ho scritto un breve script disponibile qui:

    http://www.ugiss.org/Content/Article/PIVOT-dinamico-in-SQL-Server-2005.aspx

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    Filed under: ,
    • Post Points: 5
Page 1 of 1 (6 items)
(C) 2007 User Group Italiano di SQL Server