Impostazione query di origine

di il
14 risposte

Impostazione query di origine

Buon giorno,
situazione: sto importando una tabella da un SQL server ad un altro. Per fare questo ho fatto "importa dati" e procedura automatica, scegliendo però di scrivere la query di origine in quanto i dati della tabella da leggere vanno un pò corretti. Riporto sotto il codice:
SELECT

CASE WHEN LEN(articolo)=6 THEN SUBSTRING(articolo,1,5) END as 'CODICE',
descrizione AS 'VARIETA',
CASE WHEN LEN(articolo)<6 THEN 'OBSOLETO' END as 'OBSOLETO'

FROM PH_SCAMBIO.dbo.VistaArticoli

WHERE LEN(articolo)=6
il tutto funziona bene però, purtroppo, la colonna CODICE ha molti dati doppi e che con la clausola where non riesco ad escludere. Come posso in importazione far fare lo skip del di tutti i dati doppi per quel CODICE? ho provato con diversi metodi ma nulla che funzioni. Io non sono un esperto di SQL server quindi chiedo l'aiuto di qualcuno che mi possa aiutare.

Grazie

14 Risposte

  • Re: Impostazione query di origine

    Cosa intendi per dati doppi?
    Fai un esempio riportando qualche riga di dati, se no non capiamo.

    Trovo un po' strano il modo in cui usi CASE WHEN, spiega bene in dettaglio cosa stai cercando di fare.
  • Re: Impostazione query di origine

    Allora riporto sotto un esempio di dati. Nella tabella dove vado a leggere ho 1 tabella con colonna: articolo e descrizione. Generalmente la lunghezza in caratteri dell'articolo è di 6 ma ci sono casi in cui può ridurre a 2 o aumentare a 9. Quello che voglio fare è, una volta verificato che l'articolo ha un LEN di 6 (quindi uso CASE), vado ad estrarre solo i primi 5 caratteri. Qui sta il problema: come si vede dall'esempio se tolgo la 6° lettera ottego un dato doppio ovvero 02110 (questo in realtà è il vero codice articolo mentre dalla 6° lettera in poi sono delle sottocategorie articolo). Quello che vorrei fare è importare solo 1 volta il dato es. 02110 (e tralasciare tutti gli altri uguali).

    | articolo | descrizione |
    021100 pippo
    021101#sf pippo
    021101#ba pippo
    021101#bm pippo
    021102#f1 pippo
    021103 pippo
    021104 pippo

    Spero d'essere stato chiaro.
    grazie
    Allegati:
    21806_0a17bb915e92cbeceaa33071a19b7431.png
    21806_0a17bb915e92cbeceaa33071a19b7431.png
  • Re: Impostazione query di origine

    Forse non ho capito bene (limite mio) ma la DISTINCT non funziona?
  • Re: Impostazione query di origine

    Allora :
    1) cosa c'entra tutto questo con le stringhe CODICE e OBSOLETO ?
    2) a che serve il CASE WHEN, dato che filtri già con WHERE LEN(articolo)=6 ? A nulla.
    3) Come dice MaxMag64 basta usare DISTINCT sul campo SUBSTRING(articolo,1,5)

    @MaxMag64: hai ragione, è difficile capire quando uno spiega una cosa e poi scopri che è tutt'altro.
  • Re: Impostazione query di origine

    Tralascio spiegare cosa è la colonna Obsoleto...comunque serve. Per il resto, ho cercato di spiegare come meglio potevo e mi spiace di non essere stato chiaro...mia colpa. Per ultimo, grazie a tutti per l'aiuto e per aver risolto un problema, che adesso capisco, molto banale
  • Re: Impostazione query di origine

    Non devi scusarti, è normale che accada.
    A volte chi 'legge' non riesca a cogliere il significato di chi 'scrive',
    e chi 'scrive' a volte non riesce a spiegare in parole quello vorrebbe dire a chi 'legge'.

    L'importante è non 'vedere' un conflitto e/o polemica tra le due parti.
    Le varie richieste di chiarimenti servono proprio per capirsi.

  • Re: Impostazione query di origine

    deko ha scritto:


    Tralascio spiegare cosa è la colonna Obsoleto...comunque serve. Per il resto, ho cercato di spiegare come meglio potevo e mi spiace di non essere stato chiaro...mia colpa. Per ultimo, grazie a tutti per l'aiuto e per aver risolto un problema, che adesso capisco, molto banale
    Ma figurati, @gibra, che colgo l'occasione per ringraziare per il contributo che da, come altri, qui e altrove ha fatto solo una battuta.
    A volte, nonostante l'esperienza, non ci vengono in mente le soluzioni più ovvie e ci si perde in un bicchier d'acqua...a me capita spesso.
  • Re: Impostazione query di origine

    Grazie ancora per le risposte. Comunque, avrei un'altra domanda. Ho provato da solo prima di ritornare sul forum in quanto volevo trovare la soluzione da solo. Come riesco a fare il SELECT DISTINCT su un campo singolo, come da te e MaxMag64 suggerito?
    3) Come dice MaxMag64 basta usare DISTINCT sul campo SUBSTRING(articolo,1,5)
    facendo, come ho fatto io, un SELECT DISTINCT su tutti i campi ovviamente risolve il problema a metà.
    Grazie 1000
  • Re: Impostazione query di origine

    Noi te l'abbiamo già indicato, quindi se TU che ora devi mostrare la TUA query, altrimenti cosa possiamo risponderti ....
  • Re: Impostazione query di origine

    Certamente. Premetto che la query da errore sul DISTINCT (importazione query di origine).
    SELECT
    descrizione AS 'VARIETA',
    DISTINCT(SUBSTRING(articolo,1,5)) as 'CODICE',
    
    FROM PH_SCAMBIO.dbo.VistaArticoli
    WHERE LEN(articolo)=6
    in pratica vorrei DISTINCT sul campo SUBSTRING(articolo,1,5), come da esempio sotto.

    |articolo|descrizione (tabella da importare PH_SCAMBIO.dbo.VistaArticoli)
    |012340| aaaa
    |012341| bbbbb
    |012342| aaaa

    |CODICE|VARIETA (tabella importata dopo elaborazione altro server sql dbo.IMP_metodo)
    |01234 | aaaa
    Grazie
  • Re: Impostazione query di origine

    Se SUBSTRING(articolo,1,5) torna un elenco di:
    01234
    01234
    01234
    01234
    La DISTINCT te li riepiloga in un unico risultato. Se così non è allora il discorso è diverso.
    Che tipo di errore ti da?
  • Re: Impostazione query di origine

    Se SUBSTRING(articolo,1,5) torna un elenco di:
    01234
    01234
    01234
    01234
    La DISTINCT te li riepiloga in un unico risultato
    E' esattamente quello che cerco: importare una tabella con tante colonne con DISTINCT (su 1 colonna) quindi con tato univoco.
    Ho caricato uno screenshot del messaggio di errore.

    PS: facendo un SELECT DISTINCT risolve a metà in quanto considera tutti i valori di tutte le colonne.

    Grazie
    Allegati:
    21806_08efaf97e842ace378b984786bbf7a73.png
    21806_08efaf97e842ace378b984786bbf7a73.png
  • Re: Impostazione query di origine

    Vedi perché devi pubblicare il TUO codice?
    DISTINCT(SUBSTRING(articolo,1,5)) as 'CODICE',
    Tu usi DISTINCT come una funzione, cosa che non è.
    Inoltre, perché mettere CODICE tra apici? Non ha senso.

    Ti bastava andare a studiare la sintassi corretta (io 'ripasso' spesso perché la memoria inganna...):
    SELECT (Transact-SQL) | Microsoft Docs
    https://docs.microsoft.com/it-it/sql/t-sql/queries/select-transact-sql

    Nel tuo caso dovrebbe essere:
    SELECT DISTINCT SUBSTRING(articolo,1,5) As CODICE,
    Fai attenzione che, ovviamente, se nella select includi anche il campo DESCRIZIONE e questo cambia in ogni articolo, allora la DISTINCT fallirà miseramente.
  • Re: Impostazione query di origine

    Ciao, volevo solo informare che mettendo insieme un pò di codice trovato qua e la e convertendolo alle mie esigenze ho risolto in questo modo:
    SELECT *
      FROM (
                    SELECT  SUBSTRING(articolo,1,5) as CODICE, 
                            descrizione, 
                            ROW_NUMBER() OVER(PARTITION BY SUBSTRING(articolo,1,5) ORDER BY articolo ASC) rn
                        FROM PH_SCAMBIO.dbo.VistaArticoli
                     WHERE LEN(articolo)=6
                  ) a
    WHERE rn = 1
    magari a qualcuno servirà.
    grazie a tutti
Devi accedere o registrarti per scrivere nel forum
14 risposte