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!

È stato utile?

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/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top