none
Problema creazione vista con righe in sequenza RRS feed

  • Domanda

  • Salve a tutti ,
    ho un problema relativamente alla creazione di una vista partendo da due tabelle : ecco gli script

    USE [tempdb]
    GO
    /****** Oggetto: Table [dbo].[Prodotti] Data script: 05/12/2011 10:30:34 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Prodotti](
    [IDMaster] [int] NOT NULL,
    [Descrizione] [nvarchar](50) NULL,
    [Parziale] [bit] NULL,
    [Tavolo] [int] NULL,
    CONSTRAINT [PK_Prodotti] PRIMARY KEY CLUSTERED
    (
    [IDMaster] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[Variazioni](
    [IDDettaglio] [int] NOT NULL,
    [IDMaster] [int] NOT NULL,
    [Descrizione] [nvarchar](50) NULL,
    [Prezzo] [money] NULL,
    [Tavolo] [int] NULL,
    CONSTRAINT [PK_Variazioni] PRIMARY KEY CLUSTERED
    (
    [IDDettaglio] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
    ALTER TABLE [dbo].[Variazioni] WITH CHECK ADD CONSTRAINT [FK_Variazioni_Prodotti] FOREIGN KEY([IDMaster])
    REFERENCES [dbo].[Prodotti] ([IDMaster])
    GO
    ALTER TABLE [dbo].[Variazioni] CHECK CONSTRAINT [FK_Variazioni_Prodotti]
    GO
    DELETE Variazioni
    DELETE Prodotti

    INSERT INTO [tempdb].[dbo].[Prodotti] ([IDMaster] ,[Descrizione] ,[Parziale],[Tavolo]) VALUES (1 ,'Pizza' ,0, 1)
    INSERT INTO [tempdb].[dbo].[Prodotti] ([IDMaster] ,[Descrizione] ,[Parziale],[Tavolo]) VALUES (2 ,'Spaghetti' ,1, 2)
    INSERT INTO [tempdb].[dbo].[Prodotti] ([IDMaster] ,[Descrizione] ,[Parziale],[Tavolo]) VALUES (3 ,'Acqua' ,0, 2)

    INSERT INTO [tempdb].[dbo].[Variazioni] ([IDDettaglio] ,[IDMaster] ,[Descrizione] ,[Prezzo],[Tavolo]) VALUES (1 ,1 ,'con' ,0 , 1)
    INSERT INTO [tempdb].[dbo].[Variazioni] ([IDDettaglio] ,[IDMaster] ,[Descrizione] ,[Prezzo],[Tavolo]) VALUES (2 ,1 ,'Bufala' ,1 ,1)
    INSERT INTO [tempdb].[dbo].[Variazioni] ([IDDettaglio] ,[IDMaster] ,[Descrizione] ,[Prezzo],[Tavolo]) VALUES (3 ,2 ,'senza' ,0, 2)
    INSERT INTO [tempdb].[dbo].[Variazioni] ([IDDettaglio] ,[IDMaster] ,[Descrizione] ,[Prezzo],[Tavolo]) VALUES (4 ,2 ,'Pomodoro' ,0 ,2)

    A questo punto ho bisogno di creare una vista di questo tipo :
    IDMaster - IDDettaglio - Descrizione - Prezzo - Parziale - Tavolo - Indice
    1 - 0 - Pizza - 0 - 0 - 1 - 1
    1 - 1 - con - 0 - 0 - 1 - 2
    1 - 2 - Bufala - 1 - 0 - 1 - 3
    2 - 0 - Spaghetti - 0 - 1 - 2 - 1
    2 - 3 - senza - 0 - 1 - 2 - 2
    2 - 4 - Pomodoro - 0 - 1 - 2 - 3

    Ma non riesco a crearla in quanto ci sono queste particolarità :
    Indice riparte da 1 quando cambia il tavolo
    Le righe di variazioni prendono il parziale del prodotto a cui si riferiscono
    Qualcuno può aiutarmi?
    Carlo
    giovedì 12 maggio 2011 09:02

Risposte

  • Puoi usare una Common Table Expression (CTE) tipo questa:

    WITH MyCTE
    AS
    (
    	SELECT IDMaster, 0 AS IDDettaglio, Descrizione, 0 AS Prezzo, Parziale, Tavolo, 1 AS Indice FROM Prodotti
    	UNION ALL
    	SELECT IDMaster, IDDettaglio, Descrizione, Prezzo, 0 AS Parziale, Tavolo, 0 AS Indice FROM Variazioni 
    )
    SELECT IDMaster, IDDettaglio, Descrizione, Prezzo, Parziale, Tavolo, ROW_NUMBER() OVER (PARTITION BY IDMaster ORDER BY IDMaster, IDDettaglio) AS Indice FROM MyCTE ORDER BY IDMaster, IDDettaglio
    
    

    Che ritorna:

    IDMaster - IDDettaglio - Descrizione - Prezzo - Parziale - Tavolo - Indice
    1    0    Pizza    0,00    0    1    1
    1    1    con    0,00    0    1    2
    1    2    Bufala    1,00    0    1    3
    2    0    Spaghetti    0,00    1    2    1
    2    3    senza    0,00    0    2    2
    2    4    Pomodoro    0,00    0    2    3
    3    0    Acqua    0,00    0    2    1

     

    Per maggiori info dai un'occhiata qui, qui e qui.


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD ..::.. Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    • Contrassegnato come risposta Carlik giovedì 12 maggio 2011 14:01
    giovedì 12 maggio 2011 09:52