Newsgroup: it.comp.software.database
Titolo: Raggruppamento di un raggruppamento

Cia ragazzi, non si tratrta di uno sciogli lingua, ma avrei bisogno con
una query in sql server di fare quanto in oggetto.
Ho una tabella su cui vi sono gli articoli ed i lotti prelevati a fronte
degli ordini dell'anno 2007. Bene, facendo un raggruppamento per articoli
e lotti e la somma sulle quantità, il risultato è parzialmente quello
voluto, nel senso che la somma degli articoli e lotti avviene per  singolo
ordine, a me invece interessa che la somma avvenga per articoli e lotti
totali, in sostanza l'art. A con lotto 100 deve comparire una sola volta .
Spero di essere stato chiaro
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Spero di essere stato chiaro
...non molto, nel senso che dai poche informazioni perché ti si possa
aiutare efficacemente.
Così ad occhio direi che in qualche clausola GROUP BY è specificato
anche l'ordine, per cui il raggruppamento viene fatto all'interno del
singolo ordine. Ma, senza sapere la struttura delle tabelle e senza
vedere il codice della query che estrae i dati è un po' difficile...
-- 
David Martin

 vedere il codice della query che estrae i dati è un po' difficile...
Si in effetti nella clausola c'è anche l'ordine, perché è la condizione di
WHERE, ti riporto la query:
SELECT     vw_traccialotti.blt_codart AS CodArt, BANTARTIC.bat_descr,
SUM(vw_traccialotti.bld_quantita) AS Expr1, vw_traccialotti.blt_lotto AS
lotto
FROM   vw_traccialotti INNER JOIN BANTARTIC ON vw_traccialotti.blt_codsoc
= BANTARTIC.bat_codsoc AND vw_traccialotti.blt_codart =
BANTARTIC.bat_codart
WHERE     (vw_traccialotti.bld_codsoc = '02')
GROUP BY vw_traccialotti.blt_codart, BANTARTIC.bat_descr,
vw_traccialotti.blt_lotto, vw_traccialotti.blt_dtscadenza,
vw_traccialotti.bld_numordine
HAVING      (vw_traccialotti.bld_numordine BETWEEN '80711000' AND
'80799999')
Secondo te, devo per forza riversare l'output della query in una tabella
di appoggio e poi ottenere il risultato raggruppato con una altra query
sulla nuova tabella?
Grazie
P.S.
Sto operando su una vista, ma credo ciò non implichi nulla per quanto
esposto.



Prova con la query fatta così:
-----------------
SELECT tl.blt_codart AS CodArt
	  ,b.bat_descr
	  ,SUM(tl.bld_quantita) AS Expr1
	  , tl.blt_lotto AS lotto
  FROM vw_traccialotti AS tl
INNER JOIN
	   BANTARTIC AS B
	ON tl.blt_codsoc = b.bat_codsoc
   AND tl.blt_codart = b.bat_codart
 WHERE (tl.bld_codsoc = '02')
   AND (tl.bld_numordine BETWEEN '80711000' AND '80799999')
GROUP BY
	   tl.blt_codart
	  ,b.bat_descr
	  ,tl.blt_lotto
-----------------
Spero di non aver scritto castronerie, ma senza avere le tabelle sotto è
un po' difficile fare un test...
-- 
David Martin

 un po' difficile fare un test...
Grande, va alla perfezione, grazie mille , solo che mi piacerebbe capirne
anche il motivo di funzionamento rispetto a quella che scrivevo io.
Grazie


 anche il motivo di funzionamento rispetto a quella che scrivevo io.
Beh, il motivo è semplice: i campi che specifichi dopo la clausola GROUP
BY, sono quelli in base ai quali chiedi a SQL Server di raggruppare i
dati. In pratica, ti devi chiedere con quale dettaglio mostrare i dati
(raggruppati per articolo, per articolo/lotto, per
articolo/lotto/ordine, ecc.) e specificare tali campi nella clausola di
raggruppamento. Tu aggiungevi il campo "bld_numordine", e ottenevi i
dati distinti a livello di singolo ordine.
Come suggerimento, quando fai raggruppamenti, nella clausola GROUP BY
metti gli stessi campi che hai indicato dopo la clausola SELECT, tranne
i campi che sono oggetto di una funzione di aggregazione (es. SUM).
Poi sinceramente non ho capito perché hai inserito condizioni di filtro
dopo la clausola HAVING... questo modo di procedere è comodo quando il
filtro è da fare direttamente sui dati raggruppati. Cerco di spiegarmi:
- nel tuo caso vuoi semplicemente prendere un range di ordini, in base
al numero, quindi non ha nulla a che vedere col raggruppamento e puoi
scrivere il filtro nello stesso identico modo in cui lo scriveresti in
un'istruzione non raggruppata (SELECT elenco_campi FROM tabelle WHERE
filtro);
- il filtro sulla clausola HAVING ti sarebbe utile se volessi ad esempio
filtrare i dati sul totale di ciascun articolo, ad esempio per mostrare
solo gli articoli il cui totale raggruppato è maggiore di 100; in questo
caso o fai due query (una che raggruppa e l'altra che filtra), oppure
usi HAVING, in modo che SQL Server prima si calcoli i valori e poi
filtri il risultato al volo.
HTH
-- 
David Martin

 HTH
LA verità è che l'ha messo enterprise manager quando selezionavo in
modalità visuale i campi dalle tabelle ed io a proposito non ho prestato
molta attenzione.


 molta attenzione.
...e hai toccato con mano il problema delle query create in automatico
da affari simili ad EM... consiglio personale: scriviti le query, è
molto più divertente e capisci pure cose stai facendo ;-)
-- 
David Martin

 molto più divertente e capisci pure cose stai facendo ;-)
Seguirò, decisamente, il tuo consiglio ... :)
