Есть ли способ сгруппировать несколько позиций из результата в SQL Server 2005 в одну строку? - PullRequest
1 голос
/ 10 июня 2011

Я использую SQL Server 2005. У меня есть ряд таблиц продуктов и цен, из которых я рисую представление, в котором представлено несколько позиций для каждого продукта, в зависимости от того, установлена ​​ли разметка элемента на уровне элемента, уровне категории,или уровень отдела.Таким образом, примером вывода для одного элемента будет:

Output for an example item of ID 2739

В чем я хотел бы помочь - если это вообще возможно - группировать результаты или выполнить некоторыедополнительный запрос, чтобы три позиции в моем результате были объединены в одну позицию со всеми возможными уровнями разметки в одной строке.Я не смог придумать способ сделать это, не требуя дополнительной дорогостоящей обработки на стороне сервера для создания временной таблицы и применения некоторой логики к ней, чтобы объединить 3 строки в 1. Реальная проблема - время, так как итерация черезБаза данных о продуктах, насчитывающая более 30000 наименований и выполняющая пошаговые действия, в целом делает меня чрезвычайно обременительным способом сделать это.

Если кто-то сможет мне помочь в этом, я был бы очень признателенэто.

Ответы [ 2 ]

1 голос
/ 13 июня 2011

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

Решение кода:

select pItem.itemID,pItem.item_markup_perc,pCat.cat_itemID,pCat.cat_markup_perc,pDept.dept_itemID,  pDept.dept_markup_perc
from #ProductInfo pItem
LEFT join
#ProductInfo pCat on pItem.itemID = pCat.cat_itemID
LEFT join
#ProductInfo pDept on pItem.itemID = pDept.dept_itemID
        or pDept.dept_itemID = pCat.cat_itemID
WHERE pItem.itemID is not null

UNION 

select pItem.itemID,pItem.item_markup_perc,pCat.cat_itemID,pCat.cat_markup_perc,pDept.dept_itemID,pDept.dept_markup_perc
from #ProductInfo pCat 
LEFT join
#ProductInfo pItem on pItem.itemID = pCat.cat_itemID
LEFT join
#ProductInfo pDept on pItem.itemID = pDept.dept_itemID
        or pDept.dept_itemID = pCat.cat_itemID
WHERE pCat.cat_itemID is not null

UNION

select pItem.itemID,pItem.item_markup_perc,pCat.cat_itemID,pCat.cat_markup_perc,pDept.dept_itemID,pDept.dept_markup_perc
from #ProductInfo pDept
LEFT join
#ProductInfo pCat on  pDept.dept_itemID = pCat.cat_itemID
LEFT join
#ProductInfo pItem on    pItem.itemID = pDept.dept_itemID
        or pItem.itemID = pCat.cat_itemID
WHERE pDept.dept_itemID is not null

Результаты для приведенного выше примера дадут

itemID              item_markup_perc    cat_itemID          cat_markup_perc     dept_itemID         dept_markup_perc    
 ------------------------------------------------------------------------------------------------------------------------
2739                22                  2739                77                  2739                50

Я протестировал его со случайным «разбросом» данных по трем группам столбцов, и он работает нормально, помещая элементы с одинаковыми «идентификаторами» в те же строки, будут нулевые значения, если элемент не указан в спискев категории.

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

0 голосов
/ 10 июня 2011

Не зная схемы ваших таблиц, я могу только предположить, что ниже будет то, что вы ищете.Обратите внимание, что я предполагаю, что если элемент не имеет разметки%, тогда поле item_markup_percentage будет иметь значение NULL - то же самое для категории.

SELECT I.ItemID, COALESCE(I.item_markup_percentage, C.category__markup_percentage, D.dept_markup_percentage) AS markup_pc
FROM Item I
INNER JOIN Category C
ON C.CategoryID = I.CategoryID
INNER JOIN Department D
ON D.DepartmentID = C.DepartmentID
...