none
SQL Query Innestate con clausola TOP RRS feed

  • Domanda

  • Salve a tutti

    Devo creare una query  SQL  che estrae i primi 2 record  per ogni articolo da una tabella.

    Specifico meglio. Nella tabella sono presenti gli stessi articoli ma con prezzi diversi (a seconda dei vari aumenti subiti nel corso del tempo)

    ESEMPIO:

    Articolo     Prezzo

    0001         50

    0001        100

    0001       NULL

    0001        200

    0002          70

    0002        130

    0002        185

    0003       200

    0003      220

    0003      270

    0003      NULL

    ecc.

    in alcuni casi però il prezzo potrebbe essere anche vuoto(in quanto non ancora disponibile)

    Ho la necessità di estrarre per ogni Articolo i primi 2 Record (Clausola TOP) non NULL.

    le singole Query sarebbero queste . per estraerre TUTTI I record non NULL

    SELECT        Articolo,Prezzo
    FROM            Magazzino
    WHERE        (NOT (Prezzo IS NULL))

    e per estrerre i primi 2 della tabella

    SELECT        TOP 2 Prezzo
    FROM            Magazzino

     

    ma come faccio a mettere assieme le due cose in modo da ottenere ad esempio il seguente risultato:

    (riferito all'esempio sopra)

    Articolo     Prezzo

    0001         50

    0001        100

    0002          70

    0002        130

    0003       200

    0003      220

    Grazie dell'attenzione

    • Spostato Mila Daniel Ovidiu mercoledì 14 luglio 2010 16:12 sql (Da:Microsoft Visual Basic Forum)
    mercoledì 14 luglio 2010 15:18

Risposte

Tutte le risposte

  • Articolo     Prezzo

    0001         50

    0001        100

    0002          70

    0002        130

    0003       200

    0003      220

    Grazie dell'attenzione

    Ciao,

    Se utilizzi una versione di SQL Server successiva alla 2000 potresti ricorrere all'operatore CROSS APPLY:

    USE tempdb;
    
    CREATE TABLE dbo.foo(
    Articolo char(4) NOT NULL,
    Prezzo smallint NULL
    );
    
    INSERT dbo.foo VALUES
       ('0001', 50)
      , ('0001', 100)
      , ('0001', NULL)
      , ('0001', 200)
      , ('0002', 70)
      , ('0002', 130)
      , ('0002', 185)
      , ('0003', 200)
      , ('0003', 220)
      , ('0003', 270)
      , ('0003', NULL);
    
    WITH CTE_Articoli AS
    (
      SELECT DISTINCT Articolo
      FROM dbo.foo
    )
    SELECT Q.*
    FROM CTE_Articoli AS A
    CROSS APPLY (
      SELECT TOP(2) *
      FROM dbo.foo
      WHERE Articolo = A.Articolo
      AND Prezzo IS NOT NULL
      ORDER BY Prezzo
    ) AS Q;  
    
    /* Output:
    
    Articolo Prezzo
    -------- ------
    0001   50
    0001   100
    0002   70
    0002   130
    0003   200
    0003   220
    
    (6 row(s) affected)
    
    */
    
    DROP TABLE dbo.foo;
    

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Proposto come risposta Mila Daniel Ovidiu giovedì 15 luglio 2010 09:04
    • Proposta come risposta annullata Anca Popa giovedì 2 dicembre 2010 19:38
    giovedì 15 luglio 2010 08:37
    Moderatore
  • Grazie della risposta

    ma per mia dimenticanza non ho inserito tutte le informazioni necessarie: 

    Il problema è che utilizzo Visual Basic 2010 Express  con una Windows Form connessa ad un database Access.

    attraverso una connessione creata con la procedura guidata.

    Ho pertanto un Dataset connesso al DB Access  e nel DB sono presenti oltre 100.000 Articoli....

    Ma nella creazione guidata Aggiungi Query > Usa Istruzioni SQL non viene accettata questa sintassi (ovviamente)

    E' possibile eseguire l'operazione descritta sopra in questo ambiente di sviluppo con una modalità che sia

    supportata ?

    Grazie ancora

     

     

    venerdì 16 luglio 2010 13:44
  • Il problema è che utilizzo Visual Basic 2010 Express  con una Windows Form connessa ad un database Access. 


    Access non supporta le CTE (sostituibili con una tabella derivata) e l'operatore APPLY (non sostituibile da un comando Jet-SQL).

    Ti suggerisco di riproporre il tuo quesito sul forum di Microsoft Access.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Anca Popa giovedì 2 dicembre 2010 19:37
    venerdì 16 luglio 2010 13:48
    Moderatore