Discussione:
Una specie ti tabella pivot
(troppo vecchio per rispondere)
Andrew
2007-05-16 13:01:10 UTC
Permalink
Ho una tabella master e una tabella detail ...

la master coniene un guid che si riferisce al detail che può contenere
n righe di dettaglio che riguardano tutte il singolo master.

Vorrei poter raggruppare tutto su di una unica riga ... quindi a naso
mi sembra una pivot table ... solo che non le ho mai usate prima, e
cercando degli esempi, noto che in tutti c'è sempre una casistica di
sommatoria o similare, mai una "select" condizionata ad uno specifico
campo.

Qualche indirizzamento o micro esempio?

Ciao
Andrea
Lorenzo Benaglia
2007-05-16 13:06:23 UTC
Permalink
Post by Andrew
Vorrei poter raggruppare tutto su di una unica riga ... quindi a naso
mi sembra una pivot table ... solo che non le ho mai usate prima, e
cercando degli esempi, noto che in tutti c'è sempre una casistica di
sommatoria o similare, mai una "select" condizionata ad uno specifico
campo.
Ciao Andrea,

non necessariamente.
Post by Andrew
Qualche indirizzamento o micro esempio?
Dipende dalla versione di SQL Server che stai utilizzando.
Su questo ng troverai esempi sia per SQL Server 2000 che per SQL Server 2005
(che introduce il nuovo operatore PIVOT).
Utilizza google groups per fare qualche ricerca e solo nel caso in cui non
trovassi una soluzione al tuo problema, posta un esempio completo con la
struttura delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO)
ed il risultato che vorresti ottenere.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Andrew
2007-05-16 13:30:07 UTC
Permalink
e' sql 2005 ... ma dato che non sò proprio da dove cominciare ...
(cioè sto trovando tutti esempi che sono praticamente scopiazzati e
uguali gli uni con gli altri) mi sà che faccio prima a postare del
codice qua

CREATE TABLE [dbo].[CATALOG](
[CAT_ID] [uniqueidentifier] NOT NULL,
[CAT_DESCR] [varchar](250) NOT NULL
)

CREATE TABLE [dbo].[CATALOG_DETT](
[CAP_CATID] [uniqueidentifier] NOT NULL,
[CAP_DESCR] [varchar](250) NOT NULL
[CAP_VALUE] [varchar](250) NOT NULL
)

INSERT INTO CATALOG ('FA849A7A-1632-4568-885E-04DABB9F9254',
'prodotto1')
INSERT INTO CATALOG_DETT ('FA849A7A-1632-4568-885E-04DABB9F9254',
'campo1', 'valore1')
INSERT INTO CATALOG_DETT ('FA849A7A-1632-4568-885E-04DABB9F9254',
'campo2', 'valore3')
INSERT INTO CATALOG_DETT ('FA849A7A-1632-4568-885E-04DABB9F9254',
'campo3', 'valore3')

Tralasciando constraint vari, quello che vorrei ottenere è una cosa di
questo tipo

cat_id, cat_descr, campo1, campo2, campo3, campoX

dove X può variare come numero a seconda dello specifico guid ...

Chiaramente avrò un set di guid il cui numero di colonne è sempre
identico .... ma questo è un altro discorso
Quello su cui mi sono impallato è la fusione delle due colonne

Grazie
Andrea
Lorenzo Benaglia
2007-05-16 13:50:54 UTC
Permalink
Post by Andrew
e' sql 2005 ... ma dato che non sò proprio da dove cominciare ...
(cioè sto trovando tutti esempi che sono praticamente scopiazzati e
uguali gli uni con gli altri)
E quindi? Scopiazzali anche tu! :-D
Post by Andrew
CREATE TABLE [dbo].[CATALOG](
[CAT_ID] [uniqueidentifier] NOT NULL,
[CAT_DESCR] [varchar](250) NOT NULL
)
CREATE TABLE [dbo].[CATALOG_DETT](
[CAP_CATID] [uniqueidentifier] NOT NULL,
[CAP_DESCR] [varchar](250) NOT NULL
[CAP_VALUE] [varchar](250) NOT NULL
)
INSERT INTO CATALOG ('FA849A7A-1632-4568-885E-04DABB9F9254',
'prodotto1')
INSERT INTO CATALOG_DETT ('FA849A7A-1632-4568-885E-04DABB9F9254',
'campo1', 'valore1')
INSERT INTO CATALOG_DETT ('FA849A7A-1632-4568-885E-04DABB9F9254',
'campo2', 'valore3')
INSERT INTO CATALOG_DETT ('FA849A7A-1632-4568-885E-04DABB9F9254',
'campo3', 'valore3')
Tralasciando constraint vari, quello che vorrei ottenere è una cosa di
questo tipo
cat_id, cat_descr, campo1, campo2, campo3, campoX
Cos'è campo1...campoX?
Ti ho chiesto il result set che vuoi ottenere in base alla struttura di
quelle tabelle.
Puoi disegnare una tabellina con i dati che vuoi in output?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Andrew
2007-05-16 14:34:14 UTC
Permalink
Post by Lorenzo Benaglia
E quindi? Scopiazzali anche tu! :-D
Lo farei se si adattassero al mio caso ... :)
Post by Lorenzo Benaglia
Cos'è campo1...campoX?
Ti ho chiesto il result set che vuoi ottenere in base alla struttura di
quelle tabelle.
Puoi disegnare una tabellina con i dati che vuoi in output?
Quello era un result set :)

ti ho messo i nomi delle colonne ... e il campoX stava ad indicare che
possono esserce altri 5 come 0 ... non ha importanza ... a me serve un
sistema per recuperare quello che c'è a partire dal padre.

cioè immaginando la struttura sopra

id, prodotto1 <- questi sono i dati della master table ..

id, prodotto1, camp1, campo2, campo3 ....

se poi esiste un prodotto2 che ha solo campo1, campo2 ... recupero
solo quelli ...

Ovviamente non chiederò mai set di prodotti il cui numero di campi sia
diverso, ma per come ho creato la struttura della tabella, ho con
questo sistema fatto un sistema elastico che posso aggiungere n campi
di dettaglio senza conoscerne a priori il numero specifico.


Ciao
Andrea
Lorenzo Benaglia
2007-05-16 14:48:23 UTC
Permalink
Post by Andrew
ti ho messo i nomi delle colonne ... e il campoX stava ad indicare che
possono esserce altri 5 come 0 ... non ha importanza ... a me serve un
sistema per recuperare quello che c'è a partire dal padre.
Si, ma il fatto è che le tabelle che hai postato non hanno alcuna colonna
che si chiama "Campo".
Vorrei capire che dati di origin avranno quelle colonne...
Post by Andrew
cioè immaginando la struttura sopra
id, prodotto1 <- questi sono i dati della master table ..
id, prodotto1, camp1, campo2, campo3 ....
se poi esiste un prodotto2 che ha solo campo1, campo2 ... recupero
solo quelli ...
Qui sorge uno spinoso problema: l'operatore PIVOT di SQL Server 2005 non
permette di scrivere query crosstab dinamiche, pertanto hai 3 soluzioni:

1) Adatti la sp di Itzik alle tue esigenze:
http://www.sqlmag.com/Articles/Index.cfm?ArticleID=15608

2) Ti scrivi una nuova sp basata sull'operatore PIVOT che tramite il Dynamic
SQL, restituisce un numero variabile di colonne (puoi prendere spunto dalla
sp del punto 1).

3) Inserisci tutti i dati della tabella figlia in 1 sola colonna
eventualmente con un separatore.

Google non ha indicizzato un thread del 17 ottobre 2006, quindi ti riporto
la mia risposta:

<POST>
L'argomento è stato affrontato in modo approfondito lo scorso mese di luglio
in questo thread:
http://groups.google.it/group/microsoft.public.it.sql/browse_frm/thread/25ec5df1a3d03ce9

In aggiunta a quanto troverai scritto, vorrei aggiungere una ulteriore
soluzione proposta da Itzik basata sulla clausula FOR XML PATH:

USE tempdb;
GO

CREATE TABLE dbo.TabellaA(
id_a int NOT NULL PRIMARY KEY,
descrizione varchar(10) NOT NULL
);
GO

CREATE TABLE dbo.TabellaB(
id_b int NOT NULL PRIMARY KEY,
step varchar(10) NOT NULL,
id_a int NOT NULL,
CONSTRAINT FK_TabellaB_TabellaA FOREIGN KEY(id_a)
REFERENCES dbo.TabellaA(id_a)
);
GO

INSERT dbo.TabellaA VALUES(1, 'gruppo1');

INSERT dbo.TabellaB VALUES(1, 'step1', 1);
INSERT dbo.TabellaB VALUES(2, 'step2', 1);
INSERT dbo.TabellaB VALUES(3, 'step3', 1);
GO

/* Query */
SELECT
id_a
, descrizione
, STUFF(
(SELECT ' ' + CAST(step AS VARCHAR(MAX)) AS [text()]
FROM (SELECT DISTINCT step
FROM dbo.TabellaB AS B
WHERE B.id_a = A.id_a) AS D
ORDER BY step
FOR XML PATH('')),
1, 1, '') AS Steps
FROM dbo.TabellaA AS A;
GO

/* Output:

id_a descrizione Steps
----------- ----------- -------------------
1 gruppo1 step1 step2 step3

(1 row(s) affected)

*/

DROP TABLE dbo.TabellaB, dbo.TabellaA;

Semplicemente geniale
Per maggiori informazioni consulta il seguente paragrafo dei Books Online:

"Using PATH Mode"
http://msdn2.microsoft.com/en-us/library/ms189885.aspx
</POST>

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Andrew
2007-05-16 15:26:33 UTC
Permalink
Post by Lorenzo Benaglia
Si, ma il fatto è che le tabelle che hai postato non hanno alcuna colonna
che si chiama "Campo".
Vorrei capire che dati di origin avranno quelle colonne...
Ops scusa ...

il campo che mi serve sarà la coppia descr e value della seconda
tabella ... cmq adesso provo a dare un occhio
a quello che mi hai postato.

Intanto grazie
Andrea
Andrew
2007-05-16 18:10:21 UTC
Permalink
Credo cmq che sto sbagliando l'approccio perchè le tabelle pivot da
quello che vedo restituiscono una computazione numerica ... a me serve
una pura trasposizione del valore da formato colonna a formato riga e
a queto punto dovrò fare una cosa ad hoc.

Ciao
Andrea

Loading...