Несколько результатов для одного поля в объединенном запросе SQL - PullRequest
1 голос
/ 26 февраля 2010

Я не уверен, возможно ли это с помощью SQL-запроса, но я попробую.

Я занимаюсь разработкой веб-части SharePoint на C #, которая подключается к базе данных SQL ивыполняет запрос, а затем связывает данные с этим набором результатов в виде таблицы.Работает нормально, но у меня есть небольшая загвоздка.По большей части мой запрос будет возвращать ровно один результат для каждого поля.Я отображаю информацию по вертикали, поэтому она выглядит примерно так:

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                   Cardstock

В идеале, я полагаю, что конечный результат был бы примерно таким:результат может быть что-то вроде следующего, добавив несколько столбцов, но возвращая только несколько результатов для этих полей:

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                             

Я открыт для любых предложений.Я хотел бы включить это в набор результатов без отдельного запроса, если это возможно.Вот код, который я использую для извлечения данных:

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

Я бы перечислил свой SQL-запрос, но он огромен.Сейчас я собираю более сотни полей с большим количеством форматирования и конкатенации SUBSTRING, так что это будет пустая трата места, но это действительно довольно простой запрос, где я выбираю поля с помощью оператора AS, чтобы получитьимена, которые я хочу, и с помощью нескольких левых соединений, чтобы получить нужные мне данные без нескольких запросов.Схема таблицы продукт / материал выглядит примерно так:

fldMachineID
fldProductType
fldSteel
fldWood
fldPaper

Итак, очевидно, что у каждого клиента есть несколько записей, по одной для каждого отдельного значения fldProductType.Если я что-то пропущу, я могу добавить это.Спасибо всем за время и помощь!

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

попробуйте это:

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

ВЫВОД:

RowID       Value1 Value2 CombinedValue
----------- ------ ------ ------------------
1           aaaaa  A      wood
2           bbbbb  B      rock, steel, wood
3           ccccc  C      paper, plastic
1 голос
/ 02 марта 2010

«Перевернуть» набор данных можно в SQL, например, см. H @@ p: //stackoverflow.com/questions/2344590/how-do-i-transform-rows-into-columns-in-sql-server -2005 Но я согласен, что часто это проще сделать в C #

То, что предложил KM, расширено в этой статье: http://www.simple -talk.com / sql / t-sql-программирования / concatingating-row-values-in-transact-sql /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...