none
N-esimo valore di una query RRS feed

  • Domanda

  • Salve a tutti,

    Ho una domanda curiosa da porre alla vostra attenzione :

    Ho una query del genere

    SELECT Campo FROM TABELLA

    che io adopero come subquery e, che dovrebbe ritornarmi un solo valore e, precisamente a me interessa il 2° valore;

    chiarisco adesso con un esempio, questo è il risultato della query precedente

    Valore 1

    Valore 2

    Valore 3

    Valore 4

    Valore 5

    Valore 6

    Valore 7

    io vorrei però che la query mi restituisse esclusivamente il 2° valore;

    Come posso fare senza usare procedure, viste o funzioni ma, esclusivamente codice SQL?

    PS:

    Non posso usare una clausola WHERE, perchè mi trovo in una SQL Expression di Crystal Reports e, non posso fare riferimento a valori esterni al Database

    • Modificato AngeloNew mercoledì 6 giugno 2012 13:53
    mercoledì 6 giugno 2012 13:47

Risposte

Tutte le risposte

  • Ho trovato una soluzione per SQL Server 2005 in su, usando la funzione RowCount,

    ma per SQL 2000 come agisco ?

    mercoledì 6 giugno 2012 15:59
  • per 2000 rowcount ancora non c'era.

    si poteva aggirare la cosa con tabelle temporanee, ma forse anche con una query.
    Il meccanismo era come il classico problema del select top x per ogni raggruppamento

    Ti serve cmq di incapsulare un pò di codice in qualcosa, prova innanzi tutto a vedere se in crystal report puoi usare una funzione a livello di tabella, credo di si cqm.

    tipo select campo from dbo.miafunzione(..)

    poi dentro questa funzione proviamo a risolvere l'altro problema di prendere solo l'x valore

    mercoledì 6 giugno 2012 18:11
  • Per risolvere potresti usare una tabella di appoggio cone nello script che segue:

    SELECT     IDENTITY (int, 1, 1) AS NumeroRiga, campo  INTO #temp
    FROM   tabella  SELECT  campo  FROM #Temp where NumeroRiga=2
    DROP TABLE #Temp

    Valore 2

    e ritorna la la seconda riga

    http://www.codeproject.com/Articles/39033/Row-Numbers-in-SQL-Query-Microsoft-SQL-Server-2000

    Gastone Canali >http://www.armadillo.it

    Se alcuni post rispondono al tuo quesito (non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili . GRAZIE!

    • Proposto come risposta GastoneCanali mercoledì 6 giugno 2012 21:49
    • Contrassegnato come risposta AngeloNew venerdì 8 giugno 2012 07:45
    mercoledì 6 giugno 2012 21:49
  • E' una soluzione, che non posso usare direttamente nelle SQL Expression di Crystal Reports;

    per utilizzarla debbo creare prima una funzione utente in SQL Server, che inglobi il tuo codice, per poi richiamarla da Crystal Reports:

    vediamo se mi riesce...

    giovedì 7 giugno 2012 09:07
  • Provando ad inglobare il tuo codice in una UDF, ottengo questo esito

    Cannot access temporary tables from within a function

    probabilmente non posso usare tabelle temporanee nelle UDF,

    debbo procedere diversamente, usando un cursore o una variabile tabellare, vediamo...

    giovedì 7 giugno 2012 09:30
  • Sì usando una variabile tabella funziona tutto correttamente, così :

    CREATE FUNCTION [dbo].[udf_NumberOfRow] ( @nRow INT )

    RETURNS DATETIME
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @Data DATETIME
        
        'Dichiaro la variabile tabella
        DECLARE @TabellaTemp TABLE (
          NumeroRiga INTEGER IDENTITY(1,1),
          Datastampa DATETIME
        )
        
        --Riempio la variabile tabella con i dati della tabella SSZ nell'ordine che mi interessa
        INSERT INTO @TabellaTemp
        SELECT DataUltStampa
        FROM SSZ ORDER BY DataUltStampa DESC
        
        --Estraggo il n° di riga che mi interessa
        SELECT @Data = Datastampa FROM @TabellaTemp WHERE NumeroRiga = @nRow
        
        -- Return the result of the function
        RETURN  @Data

    END
    GO

    SELECT [dbo].[udf_NumberOfRow](5) as  ValoreNRiga
    GO

    Così sembra funzionare tutto correttamente

    giovedì 7 giugno 2012 09:53
  • non ti rimane che chiudere il 3d segnando la risposta ... ma quella giusta, nessuno avrebbe potuto scrivere la tua funzione! ;)

     Ciao Gastone


    Gastone Canali >http://www.armadillo.it

    Se alcuni post rispondono al tuo quesito (non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili . GRAZIE!

    giovedì 7 giugno 2012 19:00
  • GRAZIE.

    Gastone Canali >http://www.armadillo.it

    Se alcuni post rispondono al tuo quesito (non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili . GRAZIE!

    venerdì 8 giugno 2012 08:47