Query possibile ?

di il
6 risposte

Query possibile ?

Buongiorno a tutto il forum.

Ho una tabella SQL, abbastanza semplice, dove a fronte di un Numero Ordine e Numero Riga, inserisco n record (tanti quanti sono i componenti della ricetta per ottenere il prodotto finito), per cui:

nOrdine- nRiga- ProdottoFinito - Componente1- Quantità1

nOrdine- nRiga- ProdottoFinito - Componente2- Quantità2

nOrdine- nRiga- ProdottoFinito - Componente3- Quantità3

Ora, quello che vorrei ottenere (se possibile) attraverso una query per nOrdine e nRiga, una sola riga che mi riporti oltre ai dati dell'ordine (nOrdine, nRiga, ProdottoFinito), in sequenza, tutti i componenti e le relative quantità:

es

ordine-riga-prodottofinito-componente1-qta1-componente2-qta2......fino alla fine dei componenti.

Secondo voi è possibile ?

Grazie 1000

DG

6 Risposte

  • Re: Query possibile ?

    03/12/2025 - DanieleG ha scritto:

    Secondo voi è possibile ?

    Potrei sbagliarmi, ma così a prima vista mi sembra un classico caso di pivot.

    Non li ho mai usati, ma pare che SQL Server abbia operatori specifici per questa necessità, almeno stando alla documentazione.

    Prova a dare un'occhiata e magari fai sapere com'è andata, che sono curioso. :)

  • Re: Query possibile ?

    Grazie molte Alka,

    darò un'occhiata e vediamo cosa ne esce:)

    Ti farò sapere

    Buona giornata

  • Re: Query possibile ?

    Salve a tutti...

    la risposta e' "SE e NO".... nel senso, che si puo' fare, ma non con una rotazione PIVOT standard, visto che il numero di colonne riportato deve essere "costante"...

    quindi, se ritorni 1 e 1 sola riga specifica, allora potrebbe funzionare, ma se dovessi richiedere ad esempio 2 righe, entrambe le righe devono obbligatoriamente avere il medesimo numero di colonne...

    personalmente mi piace l'utilizzo di 
    https://www.itprotoday.com/early-versions/pivot-on-steroids
    , soluzione collaudata del grandissimo Itzik Ben Gan, amico, genio matematico e eccezionale SQL coder, oltre che trainer e troubleshooter internazionale…

    i suoi libri sono sempre fonte di spunti eccellenti….

    salutoni romagnoli
    – 
    Andrea

  • Re: Query possibile ?

    Grazie a tutti

    il tempo è un po ristretto, per cui ho cambiato strada...

    In realtà la query per ottenere una sola riga, mi serviva per poi stampare il risultato (sfruttando un tool di stampa che mi ero costruito tempo fa).

    A questo punto ho creato un report (che mi fa dannare anche questo...come ho postato sul forum vb net, in quanto vorrei mandarli in stampa automaticamente ma non ci stò riuscendo).

    Saluti

    DG

  • Re: Query possibile ?

    03/12/2025 - DanieleG ha scritto:

    Buongiorno a tutto il forum.

    Ho una tabella SQL, abbastanza semplice, dove a fronte di un Numero Ordine e Numero Riga, inserisco n record (tanti quanti sono i componenti della ricetta per ottenere il prodotto finito), per cui:

    nOrdine- nRiga- ProdottoFinito - Componente1- Quantità1

    nOrdine- nRiga- ProdottoFinito - Componente2- Quantità2

    nOrdine- nRiga- ProdottoFinito - Componente3- Quantità3

    Ora, quello che vorrei ottenere (se possibile) attraverso una query per nOrdine e nRiga, una sola riga che mi riporti oltre ai dati dell'ordine (nOrdine, nRiga, ProdottoFinito), in sequenza, tutti i componenti e le relative quantità:

    es

    ordine-riga-prodottofinito-componente1-qta1-componente2-qta2......fino alla fine dei componenti.

    Secondo voi è possibile ?

    Grazie 1000

    DG

    sono prodotti alimentari?

    ho una query che elenca gli ingredienti in ordine di quantità come vuole la normativa. unica eccezione non mi da gli allergeni in grassetto o in maiuscolo.

    non sono ferrato in sql server ma la base di partenza dovrebbe essere questa:

    WITH ORDINAMENTO AS 
        ( 
        SELECT 
            Ordine,
            Riga,
            Prodotto,
            Componente,
            Quantità,
            ROW_NUMBER() OVER (
                PARTITION BY Ordine, Riga
                ORDER BY Quantità DESC, Componente
            ) AS RIGO
        FROM TuaTabella
        )
    DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX);
    
    
    SELECT @cols = STRING_AGG(
            CONCAT(
                '[Componente', RIGO, '] = MAX(CASE WHEN RIGO = ', RIGO, ' THEN Componente END), ',
                '[Qta', RIGO, '] = MAX(CASE WHEN RIGO = ', RIGO, ' THEN Quantità END)'
            )
        , ', ')
    FROM (SELECT DISTINCT RIGO FROM ORDINAMENTO) AS x;
    
    
    SET @sql = '
    SELECT Ordine, Riga, Prodotto, ' + @cols + '
    FROM ORDINAMENTO
    GROUP BY Ordine, Riga, Prodotto
    ORDER BY Ordine, Riga;
    ';
    
    EXEC sp_executesql @sql;

    ordina i prodotti in modo decrescente e li mette in riga per n ordini ed n righe. (si usava per creare la lista ingredienti nelle etichette)

    alla fine potresti leggere gli allergeni da una tabella che contiene gli elementi considerati allergeni, e trasformare in minuscolo quelli che non  sono presenti nella tabella allergeni e in maiuscolo quelli che invece sono presenti. la normativa non chiede la quantità (al massimo la %) ma non è obbligatoria (io l'ho messa ma dovrebbe essere espressa in %). 

    gli obblighi sono la lista ingredienti decrescente e il maiuscolo o grassetto per gli allergeni.

    un altro obbligo è l'elenco degli ingredienti dei lavorati. se usi marmellata va scritto marmellata(ingredienti della marmellata), se usi maionese va scritto maionese(ingredienti della maionese) in questi casi devi scrivere il valore % del semilavorato.

    questa riga per intenderci: '[Qta', RIGO, '] = MAX(CASE WHEN RIGO = ', RIGO, ' THEN Quantità END)' riporta le quantità

    la sp che ti lascio è obsoleta per la normativa ma qualcuno potrà sicuramente darti delle dritte per aggiornarla. io uso mysql di più non so dirti.

    dovresti fare la stessa procedura per elencare solo gli allergeni presenti scritti in grassetto o maiuscolo

    sorvolo sugli OGM che non ne usiamo.

  • Re: Query possibile ?

    Grazie molte sihsandrea!

    al momento, vista l'urgenza, ho risolto con un report.

    La terrò presente per eventuali altri problemi simili.

    Buona giornata

Devi accedere o registrarti per scrivere nel forum
6 risposte