Query V/S Tableadapter

di il
10 risposte

Query V/S Tableadapter

Buongiorno a tutto lo staff.

Sono a chiedervi una mano per questa query:

SELECT Conta_KM
     ,lead(Conta_KM, 1, 0) OVER (ORDER BY Id) - Conta_KM AS Percorrenza
From Carburante;

il risultato è questo:

Conta_KM Percorrenze
378960 190
379150 200
379350 -379350

A parte il fatto che la colonna “Percorrenze”, dovrebbe iniziare a sottrarre dalla seconda riga, lasciando la prima NULL o zero

Il problema adesso è che con l'editor integrato delle query di visual studio funziona, ma al momento di inserirla nel tableadapter-dataset compare il messaggio di errore:

“Il costrutto o l'istruzione sql server OVER non è supportato”.

Ho sentito parlare di creazione di tabelle temporanee.

Ad ogni buon conto, allego anche la composizione della tabella:

CREATE TABLE [dbo].[Carburante] (
   [Id]        INT        IDENTITY (1, 1) NOT NULL,
   [IdVeicolo] INT        NULL,
   [Giorno]    DATETIME   NULL,
   [Conta_KM]  FLOAT (53) NULL,
   [Prezzo_LT] FLOAT (53) NULL,
   [Quantita]  FLOAT (53) NULL,
   [Importo]   FLOAT (53) NULL,
   PRIMARY KEY CLUSTERED ([Id] ASC)
);

Grazie, saluti

10 Risposte

  • Re: Query V/S Tableadapter

    Buon giorno,

    ma tu “cosa” devi ottenere? un running total della percorrenza di ogni veicolo?
    perche' vedo che ci sarebbe anche quel partizionamento da fare…

    salutoni romagnoli,
    – 
    Andrea

  • Re: Query V/S Tableadapter

    Si esatto percorrenza per ogni veicolo.

  • Re: Query V/S Tableadapter

    Ciao Sante,

    perche' non usi un SUM in partition by IdVeicolo order by giorno?

    salutoni romagnoli,
    – 
    Andrea

  • Re: Query V/S Tableadapter

    Ciao e grazie per le risposte.

    Forse non ho afferrato il concetto, ma non devo sommare, devo

    sottrarre le letture, riga successiva meno la precedente della colonna di sinistra

    denominata “Conta_KM”. 

    Comunque provando il tuo suggerimento, mi dà lo stesso errore.

    E' allergico alla clausola OVER, perchè pare che ci debba essere.

    Questa è la bozza della query:

    Select  IDVeicolo, Giorno, Conta_KM 
       sum(Conta_KM)???? 
       over (partition by IdVeicolo order by Giorno)
        From Carburante

    Adesso da un altro tipo di errore sulle parentesi ma non ho capito quali.

    Salutoni siciliani.

  • Re: Query V/S Tableadapter

    Il problema è che il costrutto "OVER" non è supportato dal tuo editor di query di Visual Studio. In generale, "OVER" è un costrutto SQL utilizzato per determinare l'ordine dei record in una finestra di dati, che può essere utilizzato in combinazione con funzioni di finestra per calcolare valori su un sottoinsieme di record.

    Per risolvere il problema, potresti provare a utilizzare una tabella temporanea per archiviare i risultati della tua query e quindi utilizzare la tabella temporanea nella tua query. Per creare una tabella temporanea, puoi utilizzare la seguente sintassi:

    CREATE TABLE #TempTable (
        Conta_KM    FLOAT (53),
        Percorrenza FLOAT (53)
    );

    Quindi, puoi inserire i risultati della tua query nella tabella temporanea utilizzando la seguente sintassi:

    INSERT INTO #TempTable (Conta_KM, Percorrenza)
    SELECT Conta_KM, lead(Conta_KM, 1, 0) OVER (ORDER BY Id) - Conta_KM AS Percorrenza
    FROM Carburante;
    

    Infine, puoi utilizzare la tabella temporanea nella tua query del tableadapter come segue:

    SELECT Conta_KM, Percorrenza
    FROM #TempTable;
    

    Spero che questo ti aiuti a risolvere il tuo problema. Se hai altre domande, non esitare a chiedere.

  • Re: Query V/S Tableadapter

    Grazie skillzgibbys,

    Infatti l'editor me lo dice sempre che non è supportato.

    Quindi la tabella temporanea viene creata come una tabella normale giusto?

    E prenderà i dati automaticamente dall'originale?

  • Re: Query V/S Tableadapter

    Sì, la tabella temporanea viene creata come una tabella normale utilizzando l'istruzione SELECT ... INTO e i dati vengono inseriti automaticamente nella tabella temporanea dalla query SELECT che viene eseguita.

    La differenza principale tra una tabella temporanea e una tabella normale è che la tabella temporanea esiste solo per la durata della sessione corrente e viene automaticamente eliminata quando la sessione viene chiusa. Inoltre, le tabelle temporanee possono essere utilizzate per archiviare temporaneamente i dati in modo da poter eseguire query più complesse senza dover modificare la struttura delle tabelle esistenti.

    Ecco un esempio di come potrebbe essere creata una tabella temporanea e inseriti i dati in essa:

    -- crea la tabella temporanea
    SELECT Conta_KM
         ,lead(Conta_KM, 1, 0) OVER (ORDER BY Id) - Conta_KM AS Percorrenza
    INTO #Temp
    FROM Carburante;
    
    -- inserisci i dati nella tabella temporanea
    INSERT INTO #Temp (Conta_KM, Percorrenza)
    VALUES (378960, 190),
           (379150, 200),
           (379350, -379350);
    
    -- seleziona i dati dalla tabella temporanea
    SELECT *
    FROM #Temp
    

    In questo modo viene creata una tabella temporanea chiamata #Temp che contiene due colonne: Conta_KM e Percorrenza. Successivamente viene inserito alcuni dati nella tabella temporanea utilizzando l'istruzione INSERT e infine viene eseguita una query per selezionare i dati dalla tabella temporanea.

  • Re: Query V/S Tableadapter

    Grazie sempre per la disponibilità.

    Ho capito la logica. Ma questo deve essere fatto a livello di codice in visual studio connettendosi al server? E il suffisso #Temp fa riconoscere automaticamente come tabella temporanea?

    Ho provato con l'editor delle query e funziona. Ora però dobbiamo farla funzionare con il tableadapter.

  • Re: Query V/S Tableadapter

    Spiegami meglio il tuo problema. Cosa ti serve.

  • Re: Query V/S Tableadapter

    Niente di particolare. E' la creazione della tabella temporanea e su come deve essere collocata se a livello di codice VB o altro. Ci sto provando comunque.

Devi accedere o registrarti per scrivere nel forum
10 risposte