Esiste un alternanza puramente SQL per il ciclo?

1

Storicamente, probabilmente avrei scritto uno script (php o qualcosa) per scorrere tutte le righe del foglio di calcolo ed eseguire alcuni calcoli.

Sto cercando una soluzione SQL pura sulla presunzione che SQL abbia opzioni migliori dei cicli.

Come dovrei affrontare questo problema mentre utilizzo un approccio SQL puro?

PANORAMICA DEI DATI:
Abbiamo una lista (attualmente in un foglio di calcolo) di articoli per i quali vogliamo controllare l'andamento.
Facciamo finta che quel foglio di calcolo contenga questi tre elementi; 111111, 222222 e 888888.

Nel DB, abbiamo una tabella degli snapshot dell'inventario dei fornitori. Ecco un esempio semplificato:
(vedi il violino qui) .

CREATE TABLE inventory_snapshots
    ([id] int, [vendor_id] int, [item] int, [brand] varchar(1), [inventory_version] int, [quantity] int);

INSERT INTO inventory_snapshots
    ([id], [vendor_id], [item], [brand], [inventory_version], [quantity])
VALUES
    (1, 111, 111111, 'A', 5, 45),
    (2, 111, 111111, 'B', 5, 43),
    (3, 111, 222222, 'X', 5, 12),
    (4, 222, 111111, 'B', 4, 5),
    (5, 222, 888888, 'C', 4, 50),
    (6, 222, 111111, 'D', 5, 10),
    (7, 222, 888888, 'C', 5, 100),
    (8, 111, 111111, 'A', 6, 40),
    (9, 111, 222222, 'X', 6, 10);

Si noti che un venditore può avere più righe di un articolo in una determinata versione di inventario a causa delle differenze di marchio.

Obiettivo:
Il nostro obiettivo è vedere le tendenze su tutti i fornitori.
Ciò significa confrontare un elenco (attualmente in formato foglio di calcolo) di elementi rispetto al DB da recuperare:

  • numero articolo
  • starting qty (somma di qty dal numero di versione MIN per ogni
  • fornitore, articoli raggruppati per vendor_id, inventory_version) aumenti totali (somma di ogni versione della versione di ogni fornitore aumenta in qty) totale
  • aumenta (la somma di ogni versione della versione di ogni fornitore aumenta in qty)
  • terminare qty (somma di qty dal numero di versione MAX per ciascun fornitore, elementi raggruppati per vendor_id, inventory_version)

Per un altro esempio, vedi il commento in il violino.

SOMMARIO:

Sembra che SQL Server possa fare un po 'di loop, ma non è pratico.

Qual è un modo migliore per avvicinarsi a questo?

    
posta mOrloff 08.04.2014 - 23:51
fonte

1 risposta

8

A seconda della versione di SQL Server, le funzioni di windowing faranno quello che vuoi. Il 2008 ha un supporto limitato ma il 2012 aggiunge quasi tutti gli standard. La clausola over viene utilizzata per cose esattamente come questa, è disponibile anche nelle versioni express.

link

Le funzioni di visualizzazione vengono utilizzate per eseguire aggregazioni di alto livello, classifiche e analisi statistiche. Sono spesso usati per dividere e mostrare somiglianze in un set di dati.

La clausola over può partizionare una colonna e fornire una somma parziale come quella che descrivi in una dichiarazione T-SQL.

SELECT [id], [vendor_id], [item], [brand], [inventory_version], SUM([quantity])
    OVER (PARTITION BY [vendor_id], [item]
        ORDER BY [vendor_id], [item], [inventory_version]) AS qty_Totals
FROM inventory_snapshots
ORDER BY [vendor_id], [item], [inventory_version]

Il codice non è stato testato ma dovrebbe funzionare. Quello che fa è prendere il recordset, partizionarlo dal vendor_id e dall'elemento. Ciò resetta efficacemente la somma a 0 quando quella combinazione cambia. Ci assicuriamo di ordinare i risultati in modo logico per mostrare facilmente i totali correnti. Questo mostrerà la progressione delle versioni degli articoli per produttore iniziando dal più basso e passando direttamente fino all'ultimo.

Spero che questo chiarisca un po 'le cose.

    
risposta data 09.04.2014 - 00:25
fonte

Leggi altre domande sui tag