2009-02-08 2 views
0

У меня есть веб-отчет, который должен возвращать несколько продуктов из разных регионов. Упрощенный запрос будет как:Как слить результат из вызова базы данных?

Select ProductName, ProductPrice 
from Product 
where Region in (Region1, Region2, Region 3) 

В области выбирают пользователи из пользовательского интерфейса. Результат привязан к datagrid. Это могут быть несколько регионов. Но результат будет выглядеть так:

 ProductName, ProductPrice [Region 1] ProductPrice [Region 2] ... 
Prod1 
Prod2 
.... 

Продукты не такие же, как в том же регионе. В некоторых регионах некоторые могут быть пустыми. Для динамической привязки к сетке я использую DataTable, а затем динамически добавляю datacolumn для полей области. Самый простой способ - зацикливать результат, запрошенный каждой областью, затем слить продукт (1, 2, 3 ...) Он работает, но медленный, особенно для строк более 2K. Мне интересно, можно ли вообще избежать вложенного цикла.

ответ

1

Вы используете SQL Server? Если это так, вы можете использовать PIVOT operator для поворота в регионе.

+0

Спасибо, КасперОн! Я не знаю, сколько регионов выбрано, поэтому мне нужно сделать «динамический» поворот? Мне также не нужно использовать функцию агрегации. Теперь я собираюсь создать динамический запрос, чтобы вернуть IDatarRader для Grid для привязки. –

+0

@ Liang Wu: Вам нужно будет создать оператор динамически, да, но если вы это сделаете, он вернет нужный табличный набор. – casperOne

0

Я думаю, нам может понадобиться немного больше информации о запросах и цикле, которые вы используете, но можете ли вы использовать AJAX? Похоже, вы хотите, чтобы пользовательский интерфейс стал более приятным и мог получить информацию для регионов «по запросу»

+0

На самом деле я внедрил AJAX. Я пытаюсь улучшить производительность этого веб-отчета. –

0

Извините, первым ответом ниже был dud. Если я понимаю правильно, вы можете заполнить DataRows, чтобы продукт, петлю из результирующего набора:

Select ProductName, ProductPrice, Region 
from Product 
where Region in (Region1, Region2, Region 3) 
ORDER BY ProductID, Region 

новый DataRow создается для каждого нового ProductID, и каждый регион имеет DataColumn со значением ProductPrice (или ничего).


Основные детали отсутствуют на вопрос, но в целом я предлагаю позволить СУБД обрабатывать агрегированные (если вы используете базу данных?). Двухмерные агрегаты должны быть быстрыми.

  1. В группе запросов SQL по регионам и по продукту и используйте агрегированную функцию для расчета суммы (например, денег, количества). Вы должны получить из (ResultSet продукта, группы, количество) кортежи, где сумма является желаемой агрегат, или NULL
  2. В цикле ASP.NET через результирующий и построить DataTable
  3. свяжите DataTable к сеточному управлению

Даже если этот подход не подходит, попробуйте свести к минимуму количество запросов из вашего источника данных. Количество запросов никогда не должно зависеть от подсчета столбцов/строк сетки.

+0

Спасибо, мика! Я редактировал мой вопрос, чтобы понять, ясно ли это сейчас. –

+0

BTW, функция агрегации отсутствует. –