Newsgroup: it.comp.lang.visual-basic
Titolo: [1/2 OT] Query per moltiplicare i record

Sarebbe possibile tramite una query realizzare la seguente
"trasformazione", in pratica il contrario di un raggruppamento?
Esempio: Tabella di partenza
codice    quantità
aaaa      3
bbbb      2
cccc      4
il risultato dovrebbe diventare
aaaa
aaaa
aaaa
bbbb
bbbb
cccc
cccc
cccc
cccc
Ringraziamenti anticipati
-- 
Salutoni
Sergio
La vita è un lungo apprendistato per imparare ad essere giovani
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 "trasformazione", in pratica il contrario di un raggruppamento?
Tramite una query non saprei, ma con un ciclo lo fai benissimo.
Per la query credo dipenda anche dal dbms quindi magari specificalo, almeno
qualcuno ti saprà dire meglio.
-- 
DBMS Firebird
VB6 + Ado

 Per la query credo dipenda anche dal dbms quindi magari specificalo
Utilizzo access


 utilizzando attualmente.
L'unica cosa grezza che mi viene in mente è che una volta che hai la tua
tabella con un cliclo ti crei la select del tipo:
codice    quantità
aaaa      3
bbbb      2
cccc      4
dim sqlstr as string
rs.source="SELECT CODICE,SUM(QTA) AS QTA FROM TABELLA GROUP BY CODICE"
rs.open
do until rs.eof 
  for i=1 to val(rs(QTA))
    sqlstr=sqlstr & "SELECT CODICE FROM TABELLA WHERE CODICE=" &
rs("CODICE") & " UNION ALL "
  next i
loop
sqlstr=left(sqlstr,len(sqlstr)-11)'tolgo ultimo union all
Per farti tirar fuori una cosa del genere
select codice
from tabella
where codice='aaaa'
union ALL
select codice
from tabella
where codice='aaaa'
union ALL
select codice
from tabella
where codice='aaaa'
union ALL
select codice
from tabella
where codice='bbbb'
union ALL
select codice
from tabella
where codice='bbbb'
ecc
Sinceramente non credo sia meglio del ciclo classico...


 Sinceramente non credo sia meglio del ciclo classico...
No, neanche io :-)


 Utilizzo access
Anni fa ho costruito una query con problematiche simili.
Il ricordo è labile.
Rammento di aver utilizzato un modulo vb di Access, in modo che il tutto
avveniva all'interno del db e restituiva solo i dati filitrati.
es. costruzione di una funzione
Function elenco(rag As String) As String
End Function
e nella query:
ra: elenco([campotabella])
Presumo che ng di access it.comp.appl.access 
ti potrà dare risposta adeguata
Ave
giuseppeD
---
CCR
-- 


 ra: elenco([campotabella])
Siamo sempre lì, ci si mette del codice. La mia curiosità era sapere se il
linguaggio sql dava la possibilità de fare questo "antiraggruppamento"
senza ricorrere a cicli.
-- 
Salutoni
Sergio
La vita è un lungo apprendistato per imparare ad essere giovani
questo articolo e` stato inviato via web dal servizio gratuito 


 Ringraziamenti anticipati
Puoi permetterti un numero massimo di righe per tipo?
Ossia, esiste un numero che *sicuramente* non sarà mai superato nel 
campo quantità?
Premetto che, comunque, la soluzione girerà solo su dbms-Server, non 
certo su Access.
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 certo su Access.
Se mi dici che hai bisogno di stabilire un limite, e che non funziona su
access, penso di poter arguire che non deve essere una necessità che viene
soddisfatta dal linguaggio in modo "nativo"...
Se non ti è di troppo disturbo postala comunque, ma credo che a questo
punto andrò avanti con il ciclo.
Thanks


 punto andrò avanti con il ciclo.
Beh, in SQL.
Solo che SQL viene considerato da tutti come un semplice linguaggio di 
query, mentre è una cosa molto strutturata.
Diciamo che la parte che funziona solo su dbms server è quella 
preliminare, ossia la preparazione di una tabella con solo dei numeri 
da 1 a ... 15, nel tuo caso.
Nell'esempio che ti riporto qui sotto, ci sono 3 parti:
1) Preparazione della tabella di origine. Questo in realtà serve solo 
per l'esempio, perchè tu hai già una tabella
2) Preparazione della tabella con i numeratori. Questo lo faccio in RAM 
ogni volta, ma se vuoi usare Access, puoi inchiodarla una tantum nel 
db, magari esuberante come numerosità (1000 anzichè 15, ad esempio), e 
sei a posto.
3) la query vera e propria.
--1 PREPARAZIONE TABELLA ORIGINE
DROP TABLE DBO.#ORIGINALE
CREATE TABLE DBO.#ORIGINALE
(
STRINGA CHAR(20),
RIPETIZIONI INT
)
INSERT INTO DBO.#ORIGINALE (STRINGA, RIPETIZIONI) VALUES ('AAA',3)
INSERT INTO DBO.#ORIGINALE (STRINGA, RIPETIZIONI) VALUES ('BBB',2)
INSERT INTO DBO.#ORIGINALE (STRINGA, RIPETIZIONI) VALUES ('CCC',4)
--2 PREPARAZIONE TABELLA NUMERI
DROP TABLE DBO.#NUMERI
CREATE TABLE DBO.#NUMERI
(
NUMERO INT
)
INSERT INTO DBO.#NUMERI (NUMERO) VALUES (1)
INSERT INTO DBO.#NUMERI (NUMERO) VALUES (2)
INSERT INTO DBO.#NUMERI (NUMERO) VALUES (3)
INSERT INTO DBO.#NUMERI (NUMERO) VALUES (4)
INSERT INTO DBO.#NUMERI (NUMERO) VALUES (5)
INSERT INTO DBO.#NUMERI (NUMERO) VALUES (6)
--3 LA QUERY **************
SELECT ORIG.STRINGA
FROM DBO.#ORIGINALE AS ORIG
INNER JOIN
	(SELECT *
	FROM DBO.#NUMERI AS A
	FULL OUTER JOIN
		(SELECT DISTINCT STRINGA
		FROM DBO.#ORIGINALE) AS B
	ON 1=1
	) AS NUM
ON ORIG.STRINGA=NUM.STRINGA
AND ORIG.RIPETIZIONI>=NUM.NUMERO


 query, mentre è una cosa molto strutturata.
Sicuramente.
Ma se per ottenere quello che voglio devo costruirmi una tabella che
contiene i numeratori, vuol dire che sto creando un accrocchio per portere
il linguaggio a fare un qualcosa che non è scritto nel suo dna.
Non so se mi sono spiegato :-)


 Non so se mi sono spiegato :-)
Sì, è chiaro.
Però, una volta fatta la tabellina (che serve poi solo per il prodotto 
cartesiano fra la tabella originale e i numeri progressivi), poi la 
query finale è veramente una sciocchezza, e a seconda delle dimensioni 
delle tabelle coinvolte, potresti trarre beneficio a far gestire la 
moltiplicazione dei pani e dei pesci al motore SQL anzichè a VB.
