Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    residenza
    Svizzera
    Messaggi
    32

    Riunire valori campi in uno solo in MS sql server

    Ciao a tutti,

    ho una query che estrae i seguenti dati in questo modo:

    ID Persona 1 Persona 2 Persona 3 Persona 4
    11 Pinco Pallino Pinco Pallino3
    11 Pinco Pallino2 Pinco Pallino4

    Io vorrei poter avere una tabella così:

    ID Persona
    11 Pinco Pallino
    11 Pinco Pallino2
    11 Pinco Pallino 3
    11 Pinco Pallino 4

    È fattibile a livello di query/store procedure in MS SQL Server?

    Ciao e grazie

    Mau

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da mau79 Visualizza il messaggio
    ...... Io vorrei poter avere una tabella così: ........
    Tu vorresti una tabella, se ti basta "solamente" una Vista puoi fare una "UNION"
    diversamente si complica un pochino .....
    codice:
    /*   Uso Master   */
    USE [master]
    GO
    /*    Creo un DB      */
    CREATE DATABASE [Test3]
    GO
    /* Uso il DB appena creato   */
    USE [Test3]
    GO
    /*   Creo una tabella   T1   molto semplice senza Key o altro */
    CREATE TABLE [dbo].[T1]
    (
     [ID] [int] NULL,
     [Pers1] [nvarchar](50) NULL,
     [Pers2] [nvarchar](50) NULL,
     [Pers3] [nvarchar](50) NULL,
     [Pers4] [nvarchar](50) NULL
    ) ON [PRIMARY]
    GO
    /*   Creo una Vista   UNION   */
    CREATE VIEW [dbo].[Vista2]
    AS
    SELECT ID AS IdX, Pers1 AS PersX FROM dbo.T1 WHERE ((NOT (Pers1 IS NULL)) AND (NOT (LEN(Pers1) = 0))) 
    UNION ALL 
    SELECT ID AS IdX, Pers2 AS PersX FROM dbo.T1 WHERE ((NOT (Pers2 IS NULL)) AND (NOT (LEN(Pers2) = 0))) 
    UNION ALL 
    SELECT ID AS IdX, Pers3 AS PersX FROM dbo.T1 WHERE ((NOT (Pers3 IS NULL)) AND (NOT (LEN(Pers3) = 0))) 
    UNION ALL 
    SELECT ID AS IdX, Pers4 AS PersX FROM dbo.T1 WHERE ((NOT (Pers4 IS NULL)) AND (NOT (LEN(Pers4) = 0))) 
    ;
    GO
    /*   Inserisco i dati in tabella */
    INSERT [dbo].[T1] ([ID], [Pers1], [Pers2], [Pers3], [Pers4]) VALUES (11, N'PP1', NULL, N'', N'PP3')
    GO
    INSERT [dbo].[T1] ([ID], [Pers1], [Pers2], [Pers3], [Pers4]) VALUES (11, N'', N'PP2', NULL, N'PP4')
    GO
    INSERT [dbo].[T1] ([ID], [Pers1], [Pers2], [Pers3], [Pers4]) VALUES (11, N'', NULL, N'', NULL)
    GO
    /*    Finito  */
    /*   Visualizziamo direttamente a schermo il risultato della vista  */
    SELECT ID AS IdX, Pers1 AS PersX FROM dbo.T1 WHERE ((NOT (Pers1 IS NULL)) AND (NOT (LEN(Pers1) = 0))) 
    UNION ALL 
    SELECT ID AS IdX, Pers2 AS PersX FROM dbo.T1 WHERE ((NOT (Pers2 IS NULL)) AND (NOT (LEN(Pers2) = 0))) 
    UNION ALL 
    SELECT ID AS IdX, Pers3 AS PersX FROM dbo.T1 WHERE ((NOT (Pers3 IS NULL)) AND (NOT (LEN(Pers3) = 0))) 
    UNION ALL 
    SELECT ID AS IdX, Pers4 AS PersX FROM dbo.T1 WHERE ((NOT (Pers4 IS NULL)) AND (NOT (LEN(Pers4) = 0))) 
    ;
    GO
    /*   (Ri) Finito   */

  3. #3
    Quote Originariamente inviata da mau79 Visualizza il messaggio
    Ciao a tutti,

    ho una query che estrae i seguenti dati in questo modo:

    ID Persona 1 Persona 2 Persona 3 Persona 4
    11 Pinco Pallino Pinco Pallino3
    11 Pinco Pallino2 Pinco Pallino4

    Io vorrei poter avere una tabella così:

    ID Persona
    11 Pinco Pallino
    11 Pinco Pallino2
    11 Pinco Pallino 3
    11 Pinco Pallino 4

    È fattibile a livello di query/store procedure in MS SQL Server?

    Ciao e grazie

    Mau

    codice:
    USE tempdb
    go
    
    
    if OBJECT_ID('[dbo].[T1]') is not null drop  table [dbo].[T1]
    go
    
    
    CREATE TABLE [dbo].[T1]
    (
     [ID] [int] NULL,
     [Pers1] [nvarchar](50) NULL,
     [Pers2] [nvarchar](50) NULL,
     [Pers3] [nvarchar](50) NULL,
     [Pers4] [nvarchar](50) NULL
    ) ON [PRIMARY]
    GO
    
    
    insert into [dbo].[T1] ( [ID], [Pers1], [Pers2], [Pers3], [Pers4] )
    values(11,'Pers11',null,null,'Pers14')
    insert into [dbo].[T1] ( [ID], [Pers1], [Pers2], [Pers3], [Pers4] )
    values(11,null,'Pers22',null,'Pers24')
    
    -- la query che cerchi
    
    select qq.* from
    ( 
        select 
           T1.id
          ,case q.N
               when 1 then t1.pers1 
               when 2 then t1.pers2 
               when 3 then t1.pers3 
               when 4 then t1.pers4 
           end as Pers
        from 
        T1 cross join
        (
            select 1 as N
            union all
            select 2
            union all
            select 3
            union all
            select 4
        ) as q
    ) as qq
    where qq.Pers is not null

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Interessante,
    leggendo il Forum non si finisce mai di imparare,

    Hai di fatto costruito una "Tabela virtuale" ( forse meglio dire "Vista virtuale" )
    che contiene 4 record con valore 1, 2, 3, 4


    .

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.