in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

Incrociare 2 tabelle con sommatorie

Last post 12-05-2007 23.49 by bonemail. 5 replies.
Page 1 of 1 (6 items)
Sort Posts: Previous Next
  • 12-04-2007 17.18

    • bonemail
    • Top 75 Contributor
    • Joined on 12-04-2007
    • Posts 5
    • Points 85

    Incrociare 2 tabelle con sommatorie

    Salve,

    ho 2 tabelle, una magazzino fatta circa cosi

    codice int

    quantita int

    posizione_articolo varchar

    (posso avere gli stessi codici in posizioni diverse e in quantita diverse)

    e una che è la lista di prelievo (prelievo) fatta circa così:

    codice int (chiave univoca)

    quantita int

    e le devo incrociare per ottenere quello che devo "estrarre" dal magazzino.

    La mia idea è quello di fare un ungroup per ottenere di entrambe le tabelle dei record con copie=1 poi incrociandole ottengo quello che mi serve, cioè la lista degli articoli da prelevare dal magazzino presenti nella lista di prelievo ma importante con la loro posizione nel magazzino

    Qualcuno di voi conosce un metodo per fare un ungroup?

    Oppure avete altre idee su come posso procedere?

     

    Grazie mille!!

    Simone

    • Post Points: 20
  • 12-04-2007 17.23 In reply to

    • lbenaglia
    • Top 25 Contributor
      Male
    • Joined on 05-14-2007
    • Vimercate (Milano)
    • Posts 81
    • Points 1.195

    Re: Incrociare 2 tabelle con sommatorie

    bonemail:

    La mia idea è quello di fare un ungroup per ottenere di entrambe le tabelle dei record con copie=1 poi incrociandole ottengo quello che mi serve, cioè la lista degli articoli da prelevare dal magazzino presenti nella lista di prelievo ma importante con la loro posizione nel magazzino

    Ciao Simone,

    puoi postare i comandi DDL relativi alla struttura delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set finale che intendi ottenere a partire da quei dati?

    Grazie,

    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://italy.mvps.org
    • Post Points: 20
  • 12-04-2007 17.38 In reply to

    • bonemail
    • Top 75 Contributor
    • Joined on 12-04-2007
    • Posts 5
    • Points 85

    Re: Incrociare 2 tabelle con sommatorie

    --La tabella prelievo è fatta cosi

    CREATE TABLE [dbo].[PRELIEVO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL

    ) ON [PRIMARY]

    --la tabella magazzinio cosi

    CREATE TABLE [dbo].[MAGAZZINO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL,

    [POSIZ] [varchar](6) NOT NULL

    ) ON [PRIMARY]

    insert into prelievo values(1,3)

    insert into prelievo values(2,7)

    insert into prelievo values(3,1)

    insert into MAGAZZINO values(1,2,'uno')

    insert into MAGAZZINO values(1,2,'due')

    insert into MAGAZZINO values(2,1,'tre')

    insert into MAGAZZINO values(4,2,'uno')

     

    --il risultato che vorrei ottenere è:

    CODICE QUANTITA POSIZIONE

    1 2 uno --LI ESTRAGGO TUTTI PERCHè 'COPERTI' DALLA TABELLA PRELIEVO

    1 1 due --NE ESTRAGGO SOLO UNO PERCHè è IL RIMANENTE DELLA TABELLA PRELIEVO MENO QUELLO CHE HO ESTRATTO DAL RECORD PRECEDENTE

    2 1 tre --NE ESTRAGGO 1 PERCHè IN PRELIENVO NE HO SOLO 1 ANCHE SE A MAGAZZINO NE HO 7

    ... spero di essere stato abbastanza chiaroStick out tongue

    • Post Points: 20
  • 12-04-2007 23.04 In reply to

    Re: Incrociare 2 tabelle con sommatorie

    Chiaro come un libro chiuso.
    Big SmileBig SmileBig Smile
    Sei sicuro che i nomi delle tabelle sono esatti e non invertiti?

    Eppoi....vuoi che la giacenza di magazzino scali man mano che arrivano le richieste di prelievo?
    Eppoi....CODICE e' il codice del prodotto da prelevare (e quindi il campo di JOIN)?
    Eppoi....che diavolo e' la colonna POSIZIONE?
    Eppoi....SPIEGATE MEJOOOOOO!!!!

    Susu.... che qualcosa per aiutarti si riesce a farla se ci fai capire cosa ti serve....

    Ciao
    Ale

     

    • Post Points: 20
  • 12-04-2007 23.36 In reply to

    • bonemail
    • Top 75 Contributor
    • Joined on 12-04-2007
    • Posts 5
    • Points 85

    Re: Incrociare 2 tabelle con sommatorie

    Ciao Ale,

    intanto grazie per l'attenzione, ora provo a spiegarmi meglio:

    ho una lista di prelievo e un magazzino, nel magazzino ho una serie di prodotti identificati da un codice che stanno in una posizione specifica.

    Posso avere piu posizioni con lo stesso prodotto, nella stessa posizione posso avere più copie dello stesso prodotto e anche più copie di prodotti diversi.

    ho una lista di prelievo che non è altro che la somma dei prodotti che devo evadere dal magzzino, ma non so ancora da quale posizione.

    In entrambe le tabelle ho le sommatorie delle quantità aggregate rispettivamente per codice e posizione per quanto riguarda il magazzino e per codice per quanto concerne la tabella prelievo.

    Il mio problema è quello di andare ad individuare  quante copie di un prodotto devo andare a togliere dal magazzino e sopratutto da quale posizione, in base alla lista di prelievo.

    ho sistemato anche i comandi ddl:

    CREATE TABLE [dbo].[MAGAZZINO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL,

    [POSIZ] [varchar](6) NOT NULL

    ) ON [PRIMARY]

    INSERT INTO MAGAZZINO VALUES (1000,5,'A')

    INSERT INTO MAGAZZINO VALUES (1000,4,'B')

    INSERT INTO MAGAZZINO VALUES (2000,3,'C')

    INSERT INTO MAGAZZINO VALUES (3000,2,'A')

     

    CREATE TABLE [dbo].[PRELIEVO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL

    ) ON [PRIMARY]

    INSERT INTO PRELIEVO VALUES (1000,6)

    INSERT INTO PRELIEVO VALUES (2000,3)

    INSERT INTO PRELIEVO VALUES (3000,1)

     

    CREATE TABLE [dbo].[RISULTATO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL,

    [POSIZ] [varchar](6) NOT NULL

    ) ON [PRIMARY]

    INSERT INTO RISULTATO VALUES (1000,5,'A')

    INSERT INTO RISULTATO VALUES (1000,1,'B')

    INSERT INTO RISULTATO VALUES (2000,3,'C')

    INSERT INTO RISULTATO VALUES (3000,1,'A')

    Praticamente devo sottrarre dal magazzino la lista di prelievo, ma in modo sensato, quindi se la mia lista di prelievo mi chiede 10 pezzi di un prodotto , e nel mio magazzino è presente in 3 posizioni con 4 pezzi ogni posizione (quindi 12 in totale) il mio risultato deve essere una cosa simile a questa: prendi 4 pezzi dalla posizione A, prendi 4 pezzi dalla posizione B, e prendi e 2 pezzi dalla posizione C

    Ora questo calcolo lo faccio righa per righa con un assembly, mi chiedevo se era possibile avere un approccio diverso.

    Nell'assembly non faccio altro che "esplodere" entrambe le tabelle, le ricostruisco in modo tale che ogni record rappresenta un sigolo prodotto, le metto in relazione, e il risultato è proprio la lista di prelievo con associata la posizione.

    Rigrazie

     

    • Post Points: 5
  • 12-05-2007 23.49 In reply to

    • bonemail
    • Top 75 Contributor
    • Joined on 12-04-2007
    • Posts 5
    • Points 85

    Re: Incrociare 2 tabelle con sommatorie

    Questo è lo script che sono riuscito a fare, funziona correttamente ma fa delle scansioni row by row che vorrei evitare in quanto non ha delle prestazioni accezzionali (anzi!) , qualcuno sa darmi qualche idea?

     

    SET NOCOUNT ON

    -- CREO STRUTTURA TABELLE

    CREATE TABLE [dbo].[MAGAZZINO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL,

    [POSIZ] [varchar](6) NOT NULL

    ) ON [PRIMARY]

    INSERT INTO MAGAZZINO VALUES (1000,5,'A')

    INSERT INTO MAGAZZINO VALUES (1000,4,'B')

    INSERT INTO MAGAZZINO VALUES (2000,3,'C')

    INSERT INTO MAGAZZINO VALUES (3000,2,'A')

     

    CREATE TABLE [dbo].[PRELIEVO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL

    ) ON [PRIMARY]

    INSERT INTO PRELIEVO VALUES (1000,6)

    INSERT INTO PRELIEVO VALUES (2000,3)

    INSERT INTO PRELIEVO VALUES (3000,1)

     

    CREATE TABLE [dbo].[RISULTATO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL,

    [POSIZ] [varchar](6) NOT NULL,

    [ID_MAG] [int] NOT NULL

    ) ON [PRIMARY]

    -- -------------------------------------------------------

    -- CREO LA TABELLA IN CUI APPOGGIERO TEMPORANEAMENTE I DATI

    CREATE TABLE [dbo].[TEMP_MAGAZZINO](

    [CODICE] [int] NOT NULL,

    [QTA] [int] NOT NULL,

    [POSIZ] [varchar](6) NOT NULL,

    [ID] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]

     

    --SCORRO LA TABELLA MAGAZZINO E ESPLODO OGNI RECORD IN TANTI RECORD QUANT'è IL VALORE DI QTA

    --OTTENGO TANTI RECORD QUANT'è LA SUM DI QTA

    DECLARE @CODICE_M int, @QTA_M int,@POSIZ varchar(5), @I INT DECLARE miocursore CURSOR FOR

    SELECT CODICE, QTA , POSIZ FROM MAGAZZINO

    OPEN miocursore

    FETCH NEXT FROM miocursore INTO @CODICE_M, @QTA_M, @POSIZ

    SET @I=0

    WHILE @@FETCH_STATUS = 0

    BEGIN

    WHILE @I<@QTA_M

    BEGIN

    INSERT INTO TEMP_MAGAZZINO (CODICE,QTA,POSIZ) VALUES(@CODICE_M,1,@POSIZ)

    SET @I=@I+1

    END

    SET
    @I=0

    FETCH NEXT FROM miocursore INTO @CODICE_M, @QTA_M, @POSIZ

    END

    CLOSE miocursore

    DEALLOCATE miocursore

     

    --SCORRO LA TABELLA PRELIEVO

    DECLARE @CODICE_P int, @QTA_P int DECLARE miocursore CURSOR FOR

    SELECT CODICE, QTA FROM PRELIEVO

    OPEN miocursore

    FETCH NEXT FROM miocursore INTO @CODICE_P, @QTA_P

    SET @I=0

    WHILE @@FETCH_STATUS = 0

    BEGIN

    --PER OGNI RECORD VADO A SELEZIONARE TANTI RECORD DALLA TABELLA TEMP_MAGAZZINO QUNAT'è IL VALORE @QTA_P

    -- QUESTO PASSAGGIO CREDO POSSA ESSERE SICURAMENTE MIGLIORATO!!

    WHILE @I<@QTA_P

    BEGIN

    INSERT INTO RISULTATO SELECT TOP 1 CODICE,1,POSIZ,ID FROM TEMP_MAGAZZINO WHERE CODICE=@CODICE_P

    DELETE FROM TEMP_MAGAZZINO WHERE CODICE=@CODICE_P and ID IN (SELECT ID_MAG FROM RISULTATO)

    --INSERISCO I DATI NELLA TABELLA RISULTATO E VADO A CANCELLARE DA TEMP_MAGAZZINO

    --QUELLI CHE HO SPOSTATO

    SET @I=@I+1

    END

    SET
    @I=0

    FETCH NEXT FROM miocursore INTO @CODICE_P, @QTA_P

    END

    CLOSE miocursore

    DEALLOCATE miocursore

    -- ORA HO LA MIA LISTA DI PRELIEVO CON LE POSIZIONI

    SELECT CODICE,SUM(QTA) AS QTA, POSIZ FROM RISULTATO GROUP BY CODICE,POSIZ

    DROP TABLE TEMP_MAGAZZINO

    DROP TABLE MAGAZZINO

    DROP TABLE PRELIEVO

    DROP TABLE RISULTATO

     

    Simone

    • Post Points: 5
Page 1 of 1 (6 items)
(C) 2007 User Group Italiano di SQL Server