Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    27

    T-SQL 2008 query con riepilogo righe

    Ciao a tutti,
    utilizzando sql server 2008, è possibile ottenere un risultato di questo tipo?:

    Operatore1 Data q.ta importo
    Operatore1 Data q.ta importo
    Operatore1 Data q.ta importo
    Operatore1 Data q.ta importo
    Operatore1 Data q.ta importo
    _________________________________________
    Tot qta tot importo

    Operatore2 Data q.ta importo
    Operatore2 Data q.ta importo
    Operatore2 Data q.ta importo
    Operatore2 Data q.ta importo
    Operatore2 Data q.ta importo
    _________________________________________
    Tot qta tot importo

    Ovviamente, non utilizzando i report, ma solo t-sql puro.

    Grazie a tutti!

  2. #2
    con una sp, sì. ma è (IMHO) un uso improprio

  3. #3
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Io non so esattamente cosa sia TSQL ( che vergogna )
    ma direi che è qualcosa che assomiglia al linguaggio delle query

    Ti ho fatto una "minuta" in Access2003
    ( Che poi eventualmente trasformerai in TSQL2008 )

    E la unione fra i
    Campi non raggruppati
    Campi per fare la riga che precede il totale
    Campi raggruppati x Totali
    2 Campi vuoti x fare spazio fra i gruppi

    Il tutto ordinato secondo
    Operatore
    Un altro campo ( aa ) che ho aggiunto io

    __________________________________________________ ______

    La Tabella si chiama Tab

    I campi sono:
    __ Op Testo ( Operatore )
    __ Da DataOra ( Data )
    __ Qu Quantita ( Numerico )
    __ Im Importo ( Numerico )
    __ ID Contatore ( Key )

    codice:
    SELECT 
    YYY.Op, YYY.aa, YYY.Da, YYY.Qu, YYY.Im
    FROM 
    
    [
    SELECT 
    Tab.Op, 2 AS aa, Tab.Da, Tab.Qu, Tab.Im
    FROM Tab
    
    UNION
    
    SELECT Tab.Op, 4 AS aa, "_______________" AS da, "____________" AS qu, "____________" AS Im
    FROM Tab
    
    UNION
    
    SELECT Tab.Op, 6 AS aa, "" AS da, Sum(Tab.Qu) AS SommaDiQu, Sum(Tab.Im) AS SommaDiIm
    FROM Tab
    GROUP BY Tab.Op, 6, ""
    
    UNION 
    
    SELECT Tab.Op, 8 AS aa, "" AS da, "" AS qu, "" AS Im
    FROM Tab
    
    UNION 
    
    SELECT Tab.Op, 9 AS aa, "" AS da, "" AS qu, "" AS Im
    FROM Tab
    ]. AS YYY
    
    ORDER BY YYY.Op, YYY.aa
    
    ;

    Scusatemi se ho sbagliato a interpretare TSQL e sono fuori tema

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    27
    Originariamente inviato da optime
    con una sp, sì. ma è (IMHO) un uso improprio
    Non capisco il contesto di una stored procedure... una sp contiene codice SQL puro...infatti la mia domanda era: date le novità introdotte in SQL server 2005/2008, è possibile ottenere con una sola query SQL quel risultato? credo si possa fare abbinando le CTE (Common Table Expression) all'istruzione GROUP BY GROUPING SETS. Ma ho poco tempo e risolverò il problema lato client... ma la mia curiosità rimane: si può fare con una sola query SQL?

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    27
    Originariamente inviato da nman
    Io non so esattamente cosa sia TSQL ( che vergogna )
    ma direi che è qualcosa che assomiglia al linguaggio delle query

    Ti ho fatto una "minuta" in Access2003
    ( Che poi eventualmente trasformerai in TSQL2008 )

    E la unione fra i
    Campi non raggruppati
    Campi per fare la riga che precede il totale
    Campi raggruppati x Totali
    2 Campi vuoti x fare spazio fra i gruppi

    Il tutto ordinato secondo
    Operatore
    Un altro campo ( aa ) che ho aggiunto io

    __________________________________________________ ______

    La Tabella si chiama Tab

    I campi sono:
    __ Op Testo ( Operatore )
    __ Da DataOra ( Data )
    __ Qu Quantita ( Numerico )
    __ Im Importo ( Numerico )
    __ ID Contatore ( Key )

    codice:
    SELECT 
    YYY.Op, YYY.aa, YYY.Da, YYY.Qu, YYY.Im
    FROM 
    
    [
    SELECT 
    Tab.Op, 2 AS aa, Tab.Da, Tab.Qu, Tab.Im
    FROM Tab
    
    UNION
    
    SELECT Tab.Op, 4 AS aa, "_______________" AS da, "____________" AS qu, "____________" AS Im
    FROM Tab
    
    UNION
    
    SELECT Tab.Op, 6 AS aa, "" AS da, Sum(Tab.Qu) AS SommaDiQu, Sum(Tab.Im) AS SommaDiIm
    FROM Tab
    GROUP BY Tab.Op, 6, ""
    
    UNION 
    
    SELECT Tab.Op, 8 AS aa, "" AS da, "" AS qu, "" AS Im
    FROM Tab
    
    UNION 
    
    SELECT Tab.Op, 9 AS aa, "" AS da, "" AS qu, "" AS Im
    FROM Tab
    ]. AS YYY
    
    ORDER BY YYY.Op, YYY.aa
    
    ;

    Scusatemi se ho sbagliato a interpretare TSQL e sono fuori tema
    Il T-SQL (Transact SQL) è la versione di SQL sviluppata da microsoft e distribuita con SQL Server
    Per quanto riguarda la tua soluzione: se gli operatori fossero 10.000? scriveresti 10.000 righe di codice? Non credo...

  6. #6
    Originariamente inviato da Elioz
    Non capisco il contesto di una stored procedure...
    cosa intendi? spiegati meglio, grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    27
    Originariamente inviato da optime
    cosa intendi? spiegati meglio, grazie
    Intendo dire che non cambia niente utilizzare o meno una stored procedure (io utilizzo sempre le stored procedure ad esempio...), quello che mi interessa è il codice sql in essa contenuto: attraverso una sola query che utilizza le CTE combinate ai GROUPING SET si dovrebbe poter ottenere il risultato desiderato, ovvero, per ogni raggruppamento (nel mio caso gli operatori...) creare una riga di riepilogo contenente il totale.

  8. #8
    Originariamente inviato da Elioz
    Il T-SQL (Transact SQL) è la versione di SQL sviluppata da microsoft e distribuita con SQL Server
    Per quanto riguarda la tua soluzione: se gli operatori fossero 10.000? scriveresti 10.000 righe di codice? Non credo...
    Fermo restando che anche secondo me un server di database non dovrebbe
    occuparsi di formattare l'output di una query,
    direi che la query di nman si avvicina parecchio a quello che vuoi ... ed indipendentemente
    da quanti sono gli operatori.

    E' una versione raffinata - per quanto riguarda la formattazione dell'output - della seguente

    codice:
    use tempdb
    go
    
    create table Tab (Op varchar(10) ,Data Datetime ,qta int,Imp int)
    insert into Tab values('Op1', '20110901',1,10)
    insert into Tab values('Op1', '20110902',1,10)
    insert into Tab values('Op2', '20110901',2,20)
    insert into Tab values('Op2', '20110902',3,30)
    go
    
    select * from
    (
    select 'Dett' as TipoRecord, Op, Data, Qta,Imp from Tab
    UNION ALL
    select 'Tot' as TipoRecord, op, null, sum(Qta) ,sum(Imp) from Tab group by Op
    ) as q1
    order by Op,TipoRecord,data

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    27
    Originariamente inviato da sspintux
    Fermo restando che anche secondo me un server di database non dovrebbe
    occuparsi di formattare l'output di una query,
    direi che la query di nman si avvicina parecchio a quello che vuoi ... ed indipendentemente
    da quanti sono gli operatori.

    E' una versione raffinata - per quanto riguarda la formattazione dell'output - della seguente

    codice:
    use tempdb
    go
    
    create table Tab (Op varchar(10) ,Data Datetime ,qta int,Imp int)
    insert into Tab values('Op1', '20110901',1,10)
    insert into Tab values('Op1', '20110902',1,10)
    insert into Tab values('Op2', '20110901',2,20)
    insert into Tab values('Op2', '20110902',3,30)
    go
    
    select * from
    (
    select 'Dett' as TipoRecord, Op, Data, Qta,Imp from Tab
    UNION ALL
    select 'Tot' as TipoRecord, op, null, sum(Qta) ,sum(Imp) from Tab group by Op
    ) as q1
    order by Op,TipoRecord,data
    Si, hai ragione, la avevo letta male... pardon nman
    Non è cmq quello che mi serve: non una sola riga di riepilogo ma una riga di riepilogo per ogni raggruppamento...
    Hai ragione anche sulla questione della formattazione del risultato di una query: per quello ci sono i reports, ma non si tratta tanto di formattazione ma solo di una riga aggiuntiva di dati (mi serve in un DataGridView)... con i grouping sets si può fare: ammettiamo di avere 3 operatori; tramite i grouping sets vengono aggiunte all'inizio del risultato le tre righe con il totale, ma a me servono alla fine di ogni raggruppamento. Utilizzando le CTE ricorsive credo si possa ottenere un risultato del genere, ma non ho il tempo necessario per studiare la query

  10. #10
    Originariamente inviato da Elioz
    Si, hai ragione, la avevo letta male... pardon nman
    Non è cmq quello che mi serve: non una sola riga di riepilogo ma una riga di riepilogo per ogni raggruppamento...
    ma l'hai provata ?
    penso di no perchè restituisce una riga di totali per ogni operatore
    ...proprio come avevi chiesto nel tuo esempio

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 © 2025 vBulletin Solutions, Inc. All rights reserved.