none
sp per raggruppare e contare ordini della giornata RRS feed

  • Domanda

  • Salve, 
    Ho questo db: 

    USE Prova 
    GO 
    /*Creo dbo.Calendario table*/ 
    CREATE TABLE dbo.Calendario( 
    idDataCalendario INT IDENTITY(1,1) NOT NULL, 
    Anno smallint , 
    Mese smallint, 
    Giorno tinyint, 
    Settimana int 

    GO

    /*Creo dbo.tPrimiPiatti table*/ 
    CREATE TABLE dbo.tPrimiPiatti( 
    idPrimoPiatto INT IDENTITY(1,1) NOT NULL, 
    NomePrimoPiatto char (2) 

    GO

    /*Creo dbo.tSecondiPiatti table*/ 
    CREATE TABLE dbo.tSecondiPiatti( 
    idSecondoPiatto INT IDENTITY(1,1) NOT NULL, 
    NomeSecondoPiatto char (2) 

    GO

    /*Creo dbo.tContorni table*/ 
    CREATE TABLE dbo.tContorni( 
    idContorno INT IDENTITY(1,1) NOT NULL, 
    NomeContorno char (2) 

    GO

    /*Creo dbo.tClienti table*/ 
    CREATE TABLE dbo.tClienti( 
    idCliente INT IDENTITY(1,1) NOT NULL, 
    NomeCliente VARCHAR (100) 

    GO

    /*Creo dbo.OrdiniPasti table*/ 
    CREATE TABLE dbo.OrdiniPasti( 
    idOrdinePasto INT IDENTITY(1,1) NOT NULL, 
    idDataCalendario int , 
    idCliente int, 
    idPrimoPiatto int, 
    idSecondoPiatto int, 
    idContorno int 

    GO 
    /*popolo le tabelle */ 
    INSERT dbo.Calendario VALUES(2011,2,14,7); 
    INSERT dbo.Calendario VALUES(2011,2,15,7); 
    INSERT dbo.Calendario VALUES(2011,2,16,7); 
    INSERT dbo.Calendario VALUES(2011,2,17,7); 
    INSERT dbo.Calendario VALUES(2011,2,18,7);

    INSERT dbo.tPrimiPiatti VALUES('A'); 
    INSERT dbo.tPrimiPiatti VALUES('MB'); 
    INSERT dbo.tPrimiPiatti VALUES('C');

    INSERT dbo.tSecondiPiatti VALUES('MG'); 
    INSERT dbo.tSecondiPiatti VALUES('QY'); 
    INSERT dbo.tSecondiPiatti VALUES('UE');

    INSERT dbo.tContorni VALUES('BC'); 
    INSERT dbo.tContorni VALUES('BM'); 
    INSERT dbo.tContorni VALUES('U');

    INSERT dbo.tClienti VALUES('MIMMO'); 
    INSERT dbo.tClienti VALUES('MARIO'); 
    INSERT dbo.tClienti VALUES('BEPPINO');

    INSERT dbo.OrdiniPasti VALUES(1,1,3,3,3); 
    INSERT dbo.OrdiniPasti VALUES(1,2,2,3,null); 
    INSERT dbo.OrdiniPasti VALUES(1,3,2,1,3); 
    INSERT dbo.OrdiniPasti VALUES(2,1,2,1,1); 
    INSERT dbo.OrdiniPasti VALUES(2,2,2,2,null); 
    INSERT dbo.OrdiniPasti VALUES(3,1,2,null,1); 
    INSERT dbo.OrdiniPasti VALUES(3,2,2,null,1); 
    INSERT dbo.OrdiniPasti VALUES(3,3,2,2,3); 
    INSERT dbo.OrdiniPasti VALUES(4,1,2,1,1); 
    INSERT dbo.OrdiniPasti VALUES(4,3,2,1,1); 
    INSERT dbo.OrdiniPasti VALUES(5,1,1,2,null); 
    INSERT dbo.OrdiniPasti VALUES(5,2,1,2,3); 
    INSERT dbo.OrdiniPasti VALUES(5,3,1,1,3); 
    GO

    se faccio questa sp: 
    SELECT     Calendario.Anno, Calendario.Mese, Calendario.Giorno, 
    Calendario.Settimana, tPrimiPiatti.NomePrimoPiatto, 
    tSecondiPiatti.NomeSecondoPiatto, 
                          tContorni.NomeContorno 
    FROM         Calendario INNER JOIN 
                          OrdiniPasti ON Calendario.idDataCalendario = 
    OrdiniPasti.idDataCalendario LEFT OUTER JOIN 
                          tContorni ON OrdiniPasti.idContorno = 
    tContorni.idContorno LEFT OUTER JOIN 
                          tSecondiPiatti ON OrdiniPasti.idSecondoPiatto = 
    tSecondiPiatti.idSecondoPiatto LEFT OUTER JOIN 
                          tPrimiPiatti ON OrdiniPasti.idPrimoPiatto = 
    tPrimiPiatti.idPrimoPiatto 
    ottengo: 
    Anno    Mese    Giorno  Setti.  1∞    2∞    contorno 
    2011    2       14      7       C       UE      U 
    2011    2       14      7       MB      UE 
    2011    2       14      7       MB      MG      U 
    2011    2       15      7       MB      MG      BC 
    2011    2       15      7       MB      QY 
    2011    2       16      7       MB              BC 
    2011    2       16      7       MB              BC 
    2011    2       16      7       MB      QY      U 
    2011    2       17      7       MB      MG      BC 
    2011    2       17      7       MB      MG      BC 
    2011    2       18      7       A       QY 
    2011    2       18      7       A       QY      U 
    2011    2       18      7       A       MG      U

    Ë possibile ottenere che il giorno 14 sono stati ordinati: 
    1C,1MB,2UE,2U 
    Il giorno 15: 
    2MB,1MG,1QY,BC 
    Il girno 16: 
    3MB,1QY,2BC,1U 
    Il giorno 17: 
    2MB,2MG,2BC 
    Il giorno 18: 
    3A,2QY,1MG,2U

    Grazie 
    Saluti.


    lunedì 14 febbraio 2011 17:31

Risposte

  • Puoi utilizzare una UDF che concatena i risultati delle varie group by, ad esempio...

    CREATE FUNCTION udf_ContaPiattiPerGiorno(@iddata int)
    RETURNS VARCHAR(8000)
    AS
    BEGIN
        DECLARE @s varchar(8000)
        SET @s = ''
        
        SELECT @s = @s + CAST(COUNT(*) AS varchar(5)) + ',' + RTRIM(NomePrimoPiatto) + ','
        FROM tPrimiPiatti
        INNER JOIN OrdiniPasti ON tPrimiPiatti.idPrimoPiatto = OrdiniPasti.idPrimoPiatto
        WHERE idDataCalendario = @iddata
        GROUP BY NomePrimoPiatto
        
        SELECT @s = @s + CAST(COUNT(*) AS varchar(5)) + ',' + RTRIM(NomeSecondoPiatto) + ','
        FROM tSecondiPiatti
        INNER JOIN OrdiniPasti ON tSecondiPiatti.idSecondoPiatto = OrdiniPasti.idSecondoPiatto
        WHERE idDataCalendario = @iddata
        GROUP BY NomeSecondoPiatto

        SELECT @s = @s + CAST(COUNT(*) AS varchar(5)) + ',' + RTRIM(NomeContorno) + ','
        FROM tContorni
        INNER JOIN OrdiniPasti ON tContorni.idContorno = OrdiniPasti.idContorno
        WHERE idDataCalendario = @iddata
        GROUP BY NomeContorno
        
        IF RIGHT(@s, 1) = ','
        SET @s = LEFT(@s, LEN(@s)-1)
        
        RETURN @s
    END
    GO

    e la usi così:

    SELECT     
        Calendario.Anno,
        Calendario.Mese,
        Calendario.Giorno,
        Calendario.Settimana,
        dbo.udf_ContaPiattiPerGiorno(OrdiniPasti.idDataCalendario)
    FROM         
        Calendario
    INNER JOIN OrdiniPasti ON Calendario.idDataCalendario = OrdiniPasti.idDataCalendario

    Qui trovi altro materiale.

    Ciao.


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    venerdì 25 febbraio 2011 09:46

Tutte le risposte

  • Puoi utilizzare una UDF che concatena i risultati delle varie group by, ad esempio...

    CREATE FUNCTION udf_ContaPiattiPerGiorno(@iddata int)
    RETURNS VARCHAR(8000)
    AS
    BEGIN
        DECLARE @s varchar(8000)
        SET @s = ''
        
        SELECT @s = @s + CAST(COUNT(*) AS varchar(5)) + ',' + RTRIM(NomePrimoPiatto) + ','
        FROM tPrimiPiatti
        INNER JOIN OrdiniPasti ON tPrimiPiatti.idPrimoPiatto = OrdiniPasti.idPrimoPiatto
        WHERE idDataCalendario = @iddata
        GROUP BY NomePrimoPiatto
        
        SELECT @s = @s + CAST(COUNT(*) AS varchar(5)) + ',' + RTRIM(NomeSecondoPiatto) + ','
        FROM tSecondiPiatti
        INNER JOIN OrdiniPasti ON tSecondiPiatti.idSecondoPiatto = OrdiniPasti.idSecondoPiatto
        WHERE idDataCalendario = @iddata
        GROUP BY NomeSecondoPiatto

        SELECT @s = @s + CAST(COUNT(*) AS varchar(5)) + ',' + RTRIM(NomeContorno) + ','
        FROM tContorni
        INNER JOIN OrdiniPasti ON tContorni.idContorno = OrdiniPasti.idContorno
        WHERE idDataCalendario = @iddata
        GROUP BY NomeContorno
        
        IF RIGHT(@s, 1) = ','
        SET @s = LEFT(@s, LEN(@s)-1)
        
        RETURN @s
    END
    GO

    e la usi così:

    SELECT     
        Calendario.Anno,
        Calendario.Mese,
        Calendario.Giorno,
        Calendario.Settimana,
        dbo.udf_ContaPiattiPerGiorno(OrdiniPasti.idDataCalendario)
    FROM         
        Calendario
    INNER JOIN OrdiniPasti ON Calendario.idDataCalendario = OrdiniPasti.idDataCalendario

    Qui trovi altro materiale.

    Ciao.


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD
    venerdì 25 febbraio 2011 09:46
  • Grazie mille Danilo; anche per il Link.

    ciao.

    venerdì 25 febbraio 2011 16:53