Frank Bailey
Frank Bailey

Reputation: 195

Is there a way to group multiple line items from a result in SQL Server 2005 into a single line item?

I'm using SQL Server 2005. I have a series of product and pricing tables from which I draw a view that provides several line items for each product, depending on whether the item's markup is set at item level, category level, or department level. So an example of the output for a single item would be:

Output for an example item of ID 2739

What I'd like some help with - if it's at all possible - is grouping the output or performing some additional query on it so that the three line items in my result are combined into a single line item, with all the possible markup levels on one line. I've been unable to think of a way to do this without requiring additional expensive server-side processing to create a temp table and apply some logic to it to combine the 3 lines into 1. The real issue is time, since iterating through a product database of over 30000 items and performing per-line steps on the whole thing strikes me as an extremely cumbersome way to do this.

If anyone might be able to help me out on this, I'd really appreciate it.

Upvotes: 1

Views: 1418

Answers (2)

Brett Le Roux
Brett Le Roux

Reputation: 26

Based on what your data view looks like, the simplest solution is a set of unions. Probably not be most performant, but a lot simpler than trying to achieve it via upserts on a resultant temp table.

Code solution:

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

The results for your above example would give

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

I tested it with random "scatterings" of data across the three column groups and it works fine, placing items with the same "ids" in the same rows, will null values where the item was not listed in the category.

Like I said, not the most performant, so you would have to look at indexing, filtering etc to get the best results.

Upvotes: 1

Will A
Will A

Reputation: 24998

Without knowing the schema of your tables, I can only speculate that the below will be what you're after. Note that I'm assume that if an item doesn't have a markup % then the item_markup_percentage field will be NULL - same for category.

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

Upvotes: 0

Related Questions