Vários resultados para um campo em uma juntou consulta SQL
-
23-09-2019 - |
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!
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/