risultati multipli per un campo in una query SQL unito
-
23-09-2019 - |
Domanda
Non sono sicuro se questo è possibile da una query SQL, ma ho deciso di dargli un andare.
sto sviluppando una web part di SharePoint in C # che si connette a un database SQL ed esegue una query, quindi databinds che set di risultati ad un GridView. Sta funzionando benissimo, ma ho un piccolo intoppo. Per la maggior parte, la mia domanda tornerà esattamente un risultato per ogni campo. Io sono la visualizzazione delle informazioni in verticale, in modo che appaia più o meno in questo modo:
Customer Name Mr. Customer
Customer Address 980 Whatever St.
Customer City Tallahassee
Tutto mostra bene. Tuttavia, una delle tabelle del database sarà praticamente sempre restituire più risultati. Esso elenca i diversi tipi di materiali utilizzati per i diversi prodotti, in modo dallo schema è diverso perché mentre ogni cliente avrà ovviamente un nome, un indirizzo, una città, ecc, tutti avranno almeno un prodotto, e il prodotto avranno a almeno un materiale. Se dovessi visualizzare le informazioni sul proprio, che sarebbe simile a questa:
Product Steel Type Wood Type Paper Type
-----------------------------------------------------------------------------
Widget Thick Oak Bond
Whatsit Thin Birch
Thingamabob Oak Cardstock
Idealmente, suppongo che il risultato finale sarebbe qualcosa di simile:
Customer Name Mr. Customer
Customer Address 980 Whatever St.
Customer City Tallahassee
Widget Steel Thick
Widget Wood Oak
Widget Paper Bond
Whatsit Steel Thin
Whatsit Wood Birch
Thingamabob Wood Oak
Thingamabob Paper Cardstock
Un altro risultato accettabile potrebbe essere qualcosa di simile a quanto segue, aggiungendo un paio di colonne, ma solo di tornare più risultati per i campi:
Customer Name Mr. Customer
Customer Address 980 Whatever St.
Customer City Tallahassee
Product Steel Type Wood Type Paper Type
Widget Thick Oak Bond
Whatsit Thin Birch
Thingamabob Oak
Sono aperto a qualsiasi suggerimento. Mi piacerebbe includere questo nel set di risultati, senza una query separata, se è possibile. Ecco il codice che sto usando per tirare dentro i dati:
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, "Specs");
DataSet flipped_ds = FlipDataSet(ds);
DataView dv = flipped_ds.Tables[0].DefaultView;
GridView outputGrid = new GridView();
outputGrid.ShowHeader = false;
outputGrid.DataSource = dv;
outputGrid.DataBind();
Controls.Add(outputGrid);
Vorrei elencare la mia query SQL, ma è enorme. Sto tirando in oltre un centinaio di campi in questo momento, con un sacco di formattazione SUBSTRING e la concatenazione, quindi sarebbe uno spreco di spazio, ma è davvero una abbastanza semplice query dove sto selezionando i campi con l'affermazione da ottenere il nomi che voglio, e utilizzando un paio LEFT JOIN a tirare nei dati che ho bisogno senza diverse query. Lo schema del prodotto / tabella dei materiali è qualcosa di simile:
fldMachineID
fldProductType
fldSteel
fldWood
fldPaper
Quindi, ovviamente, ogni cliente ha un numero di voci, una per ogni valore fldProductType diversa. Se me ne vado nulla, posso aggiungerlo. Grazie per il tempo di tutti e aiuto!
Soluzione
provare questo:
DECLARE @TableA table (RowID int, Value1 varchar(5), Value2 varchar(5))
DECLARE @TableB table (RowID int, TypeOf varchar(10))
INSERT INTO @TableA VALUES (1,'aaaaa','A')
INSERT INTO @TableA VALUES (2,'bbbbb','B')
INSERT INTO @TableA VALUES (3,'ccccc','C')
INSERT INTO @TableB VALUES (1,'wood')
INSERT INTO @TableB VALUES (2,'wood')
INSERT INTO @TableB VALUES (2,'steel')
INSERT INTO @TableB VALUES (2,'rock')
INSERT INTO @TableB VALUES (3,'plastic')
INSERT INTO @TableB VALUES (3,'paper')
;WITH Combined AS
(
SELECT
a.RowID,a.Value1,a.Value2,b.TypeOf
FROM @TableA a
LEFT OUTER JOIN @TableB b ON a.RowID=b.RowID
)
SELECT
a.*,dt.CombinedValue
FROM @TableA a
LEFT OUTER JOIN (SELECT
c1.RowID
,STUFF(
(SELECT
', ' + TypeOf
FROM Combined c2
WHERE c2.rowid=c1.rowid
ORDER BY c1.RowID, TypeOf
FOR XML PATH('')
)
,1,2, ''
) AS CombinedValue
FROM Combined c1
GROUP BY RowID
) dt ON a.RowID=dt.RowID
USCITA:
RowID Value1 Value2 CombinedValue
----------- ------ ------ ------------------
1 aaaaa A wood
2 bbbbb B rock, steel, wood
3 ccccc C paper, plastic
Altri suggerimenti
"Flipping" set di dati può essere fatto in SQL, ad esempio, vedere h @@ p: //stackoverflow.com/questions/2344590/how-do-i-transform-rows-into-columns-in-sql-server -2005 Ma sono d'accordo che spesso è più semplice per fare questo in C #
Cosa KM suggerito è ampliato in questo articolo: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/