Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    struttura ad albero [SQL 2000]

    salve a tutti,
    mi serve riproporre in sql una struttura ad albero, per poi calcolare delle sommatorie in base al livello di appartenenza.
    come mi consigliate di procedere per creare una struttura ad albero solida ma flessibile? (flessibile nella creazione di nuovi livelli e nella modifica deigli stessi)

    grazie mille! attendo consigli

  2. #2

  3. #3
    grazie gioba!
    in base a questo articolo che mi hai linkato,
    http://www.sqlteam.com/item.asp?ItemID=8866

    mi pare tutto ruoti intorno a una stored procedure che mi popolerebbe, grazie ad un loop, un campo "lineage" in cui è indicata in modo preciso l'appartenenza di quella riga (come da immagine presa dall'articolo che ho linkato in alto)



    Questo naturalmente mi esula da i numerosi join a cui ero costretto prima, e che legavano la struttura a un numero massimo di livelli.


    Però sarebbe difficile eseguire calcoli sommatori o aggregati in genere su una singolo gruppo (se io ad esempio raggruppassi per lineage "/100/101" mi verrebbero esclusi dal conto tutte le righe di livello "superiore" (i figli di 101). Potrebbe forse essere risolto con un comando LEFT in base al campo depth ma mi sembra che risulti un po' troppo macchinoso e forse anche le prestazioni calerebbero drasticamente.

    Ci sono altri modi a detta tua / vostra di risolvere il problema dei calcoli sommatori?

    grazie

    p.s. io per ora, ho risolto in maniera "legnosa" creando una tabella con n colonne, una per livello. E' sulla singola riga, senza la necessità di campi calcolati, che ne vedo quindi l'apartenenza precisa. Questo naturalmente mi limita il numero di livelli a un numero definito. In base al livello di sommatoria che voglio ottenere sarebbe la colonna la discriminante da aggregare.



    Il join con l'altra tabella in questo caso verrebbe eseguito sulla colonna "ultimo" colonna calcolata con un COALESCE

    Quale vi sembra la soluzione migliore tenendo conto che gli 8 livelli che ho previsto sarebbero più che sufficielnti per qualisasi evenienza attuale e futura?

    grazie ancora!!

  4. #4
    Utente di HTML.it L'avatar di Gioba66
    Registrato dal
    Jun 2002
    Messaggi
    2,189
    sinceramente "rabbrividisco" nel vedere la struttura che hai scelto
    Con la struttura indicata nell'articolo puoi ottenere tutti i risultati che chiedi, lavorando sui campi depth e parentnode
    Puoi farti delle funzioni che calcolano le somme che desideri, ma almeno usa una struttura di database decente
    Tutti vogliono parlare, nessuno sa ascoltare.

  5. #5
    grazie gioba, in effetti ho provato anche io gli stessi brividi nel creare la struttura!
    diciamo che la scelta della struttura che ho postato è stata dopo aver provato a creare (partendo da una struttura di tabella padre - figlio - livello) i risultati desiderati.
    Senza il campo calcolato stile "lineage" le query - subquery per ottenere quello che mi serviva erano davvero macchinose (più legnose della struttura ad albero "orizzontale") e incasinate!

    adesso vado di loop!
    eheh quindi da quello che ho capito confermi l'utilizzo del comando LEFT per i raggruppamenti di cui parlavo?

    grazie mille!

  6. #6
    Utente di HTML.it L'avatar di Gioba66
    Registrato dal
    Jun 2002
    Messaggi
    2,189
    Originariamente inviato da Radmond_Barry
    eheh quindi da quello che ho capito confermi l'utilizzo del comando LEFT per i raggruppamenti di cui parlavo?
    non ho capito a cosa ti riferisci
    Tutti vogliono parlare, nessuno sa ascoltare.

  7. #7
    Originariamente inviato da Gioba66
    non ho capito a cosa ti riferisci
    parlo del GROUP BY che dovrei creare per sapere ad esempio quanti impiegati ha sotto il boss con node "102" o tutti i boss della stessa "classe"


    SELECT count(*), LEFT(lineage, 8)
    from TABELLA
    group by LEFT(lineage, 8)

    uhm e addirittura da quanto mi riesce di intuire ora la descrizione di quei "boss" (che si trova in un'altra tabella) non saprei come tirarla fuori... un join sul campo node mi escluderebbe tutte le altre righe che invece devo conteggiare
    boh

    Questo per rimanere nell'esempio dell'articolo che mi hai linkato, in realtà io devo raggruppare delle operazioni contabili in base al loro centro di costo, e sono i centri di costo che hanno la famosa struttura ad albero. Ad esempio se io ho un centro di costo 100 con figli 101, 102, 103 se raggruppassi per il padre 100 vorrei comprendere nei miei calcoli anche tutte le operazioni contabili imputate agli altri 3 centri di costo 101 102 e 103

    Grazie dell'attenzione gioba!!

  8. #8
    Utente di HTML.it L'avatar di Gioba66
    Registrato dal
    Jun 2002
    Messaggi
    2,189
    sì, così potrebbe andare bene
    ed usando depth puoi decidere quanto scendere nell'albero
    Tutti vogliono parlare, nessuno sa ascoltare.

  9. #9
    grazie gioba dei consigli!

    mi sei stato parecchio utile!

  10. #10
    Utente di HTML.it L'avatar di Gioba66
    Registrato dal
    Jun 2002
    Messaggi
    2,189
    giusto per la cronaca, se passi a SQL2005 puoi usare le CTE
    http://msdn2.microsoft.com/en-us/library(d=printer)/ms186243.aspx
    ciao!
    Tutti vogliono parlare, nessuno sa ascoltare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.