2010-02-26 2 views
1

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

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

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 
Widget Steel   Thick 
Widget Wood    Oak 
Widget Paper   Bond 
Whatsit Steel   Thin 
Whatsit Wood   Birch 
Thingamabob Wood  Oak 
Thingamabob Paper  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, чтобы получить имена, которые я хочу, и используя несколько LEFT JOINs, чтобы вытащить нужные мне данные без нескольких запросов. Схема таблицы продукта/материала что-то вроде этого:

fldMachineID 
fldProductType 
fldSteel 
fldWood 
fldPaper 

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

+0

Какая база данных вы используете, и как вы ожидаете возвращения этих значений? –

+0

Я не уверен, что понимаю. Как бы то ни было, мне кажется, что все, что вам нужно сделать, это добавить LEFT JOIN. Но из вашего вопроса очевидно, что вы знаете о LEFT JOINS, так что это не может быть так просто. Это возвращает меня к «Я не уверен, что понимаю». Возможно, добавление ожидаемого результата позволит прояснить ситуацию. –

+0

Я использую SQL Server 2005. Я отредактировал исходный вопрос, чтобы лучше отразить мои желаемые результаты. Теперь, когда я это сделал, я уверен, что вы увидите, что добавление другого LEFT JOIN теперь даст мне несколько наборов результатов (по одному для каждого результата в fldProductType), но в контексте datagrid мне действительно нужен только один столбец названий типов данных и второго столбца результатов. –

ответ

2

попробовать это:

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 
+0

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

1

набор данных "листать" может быть сделано в SQL, например, см ч @@ р: //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-programming/concatenating-row-values-in-transact-sql/