Pergunta

Eu não tenho certeza se isso é possível a partir de uma consulta SQL, mas eu vou dar-lhe um ir.

Eu estou desenvolvendo um web part do SharePoint em C# que se conecta a um banco de dados SQL e executa uma consulta e, em seguida, databinds que o conjunto de resultados para um gridview.É um trabalho muito bem, mas eu tenho uma pequena protuberância.Para a maior parte, a minha consulta retornará exatamente um resultado para cada campo.Eu sou apresentar a informação verticalmente, de modo que parece, aproximadamente assim:

Customer Name           Mr. Customer
Customer Address        980 Whatever St.
Customer City           Tallahassee

Tudo o que exibe bem.No entanto, uma das tabelas no banco de dados praticamente irá sempre retornar vários resultados.Ele lista os diferentes tipos de materiais utilizados para diferentes produtos, portanto, o esquema é diferente, porque enquanto cada cliente, obviamente, tem um nome, um endereço, uma cidade, etc., todos eles terão pelo menos um produto e esse produto vai ter pelo menos um material.Se eu fosse para mostrar que as informações sobre si próprio, seria algo parecido com isto:

Product              Steel Type              Wood Type             Paper Type
-----------------------------------------------------------------------------
Widget               Thick                   Oak                   Bond
Whatsit              Thin                    Birch
Thingamabob                                  Oak                   Cardstock

Idealmente, eu suponho que o resultado final seria algo como:

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

Outro resultado aceitável poderia ser algo como o seguinte, acrescentando algumas colunas, mas apenas retornar vários resultados para os campos:

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                             

Estou aberto a sugestões.Eu gostaria de incluir isso no conjunto de resultados sem uma consulta separada, se é que isso é possível.Aqui está o código que estou usando para obter os dados:

                    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);

Eu teria minha lista de consulta SQL, mas é enorme.Eu estou puxando em bem mais de cem campos de agora, com lotes de SUBSEQÜÊNCIA de caracteres de formatação e de concatenação, então seria um desperdício de espaço, mas é realmente bastante simples consulta onde eu estou selecionando campos com a instrução para obter os nomes que eu quero, e usando alguns ESQUERDA Junta-se para puxar os dados de que preciso sem várias consultas.O esquema do produto/material de tabela é algo como isto:

fldMachineID
fldProductType
fldSteel
fldWood
fldPaper

Então, obviamente, cada cliente tem um número de entradas, uma para cada diferente fldProductType valor.Se eu estou deixando nada de fora, que eu possa acrescentar.Obrigado por todos que de tempo e ajuda!

Foi útil?

Solução

tente isso:

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

SAÍDA:

RowID       Value1 Value2 CombinedValue
----------- ------ ------ ------------------
1           aaaaa  A      wood
2           bbbbb  B      rock, steel, wood
3           ccccc  C      paper, plastic

Outras dicas

"Virar" conjunto de dados pode ser feito em sql, por exemplo, ver h@@p://stackoverflow.com/questions/2344590/how-do-i-transform-rows-into-columns-in-sql-server-2005 Mas eu concordo que muitas vezes é mais simples de fazer isso em C#

O que KM sugerido é expandido neste artigo: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top