ВЫБЕРИТЕ СЛУЧАЙ с псевдонимом в SQL Server 2008 - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть хранимая процедура, которую я не могу заставить работать:

ALTER PROCEDURE GetBrands
@sortColumn INT
AS
SELECT          DISTINCT(tblBrand.BrandID),             
                tblBrandinCategory.CategoryID,
                tblBrand.BrandName AS Brand, 
                AVG(tblReview.Grade) AS AverageGrade,  
                COUNT(tblReview.ReviewID) AS Review

FROM            tblBrand LEFT JOIN
                            tblBrandinCategory ON tblBrand.BrandID = tblBrandinCategory.BrandID LEFT JOIN
                            tblReview ON tblBrand.BrandID = tblReview.BrandID

GROUP BY tblBrand.BrandID, tblBrandinCategory.CategoryID, tblBrand.BrandName

ORDER BY
CASE 
WHEN @sortColumn = 1 THEN Brand
WHEN @sortColumn = 2 THEN Review
WHEN @sortColumn = 4 THEN AverageGrade
ELSE Brand
END

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

tblBrand
BrandID    BrandName
1          Nike
2          Adidas
3          Puma

tblCategory
CategoryID   CategoryName
1            Shoes
2            Shorts
3            Pants

tblBrandInCategory
CategoryID    BrandID   
1             1
2             1
3             1

tblReview
ReviewID      Grade    BrandID
1             5        1
2             9        1 
3             2        1 

Я получаю результат, умноженный на три, потому что BrandID 1 существует 3 раза в tblBrandInCategoiry.

Другая проблема состоит в том, что в случае ORDER BY CASE я получаю ошибки, что AverageGrade не распознается, но tblReview.Grade - это хорошо, но я хочу заказать его для Average Grade.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Другая проблема заключается в том, что в ORDER BY CASE я получаю ошибки о том, что AverageGrade не распознается, но с tblReview.Grade все в порядке, но я хочу заказать его по средней оценке.

AverageGrade нельзя использовать в качестве столбца для сортировки, пока вашим основным запросом не будет подзапрос ....

Я получаю результат, умноженный на три, поскольку BrandID 1 существует 3 раза в tblBrandInCategoiry.

create table #tblBrand
(
BrandID    int,
BrandName varchar(10)
)

create table #tblCategory
(
CategoryID       int,
CategoryName varchar(10)
)

create table #tblBrandInCategory
(
CategoryID       int,
BrandID int
)

create table #tblReview
(
ReviewID             int,
Grade    int,
BrandID int
)

insert into #tblBrand(BrandID, BrandName)values(1, 'Nike')
insert into #tblBrand(BrandID, BrandName)values(2, 'Adidas')
insert into #tblBrand(BrandID, BrandName)values(3, 'Puma')



insert into #tblCategory(CategoryID, CategoryName)values(1, 'Shoes')
insert into #tblCategory(CategoryID, CategoryName)values(2, 'Shorts')
insert into #tblCategory(CategoryID, CategoryName)values(3, 'Pants')

insert into #tblBrandInCategory(CategoryID, BrandID)values(1, 1)
insert into #tblBrandInCategory(CategoryID, BrandID)values(2, 1)
insert into #tblBrandInCategory(CategoryID, BrandID)values(3, 1)


insert into #tblReview(ReviewID, Grade, BrandID)values(1, 5, 1)
insert into #tblReview(ReviewID, Grade, BrandID)values(2, 5, 9)
insert into #tblReview(ReviewID, Grade, BrandID)values(3, 2, 1)


Select BrandID, Brand, AverageGrade, Review
From
(
SELECT          DISTINCT(#tblBrand.BrandID),             
                --#tblBrandinCategory.CategoryID,
                #tblBrand.BrandName AS Brand, 
                AVG(#tblReview.Grade) AS AverageGrade,  
                COUNT(#tblReview.ReviewID) AS Review

FROM            #tblBrand 
                LEFT JOIN #tblBrandinCategory ON #tblBrand.BrandID = #tblBrandinCategory.BrandID 
                LEFT JOIN #tblReview ON #tblBrand.BrandID = #tblReview.BrandID

GROUP BY #tblBrand.BrandID, #tblBrandinCategory.CategoryID, #tblBrand.BrandName
)K
ORDER BY
CASE 
WHEN @sortColumn = 1 THEN Brand
WHEN @sortColumn = 2 THEN Review
WHEN @sortColumn = 4 THEN AverageGrade
ELSE Brand

drop table #tblBrand
drop table #tblCategory
drop table #tblBrandInCategory
drop table #tblReview

Окончательный набор результатов

enter image description here

0 голосов
/ 01 февраля 2012

Просто отредактируйте SELECT, чтобы исключить результаты tblBrandInCategory:

SELECT tblBrand.BrandID,                              
     tblBrand.BrandName AS Brand,
     AVG(tblReview.Grade) AS AverageGrade, 
     COUNT(tblReview.ReviewID) AS Review 
FROM tblBrand 
     --tblBrandinCategory isn't even needed for what you're doing
     --LEFT JOIN tblBrandinCategory ON tblBrand.BrandID = tblBrandinCategory.BrandID 
     LEFT JOIN tblReview ON tblBrand.BrandID = tblReview.BrandID 
GROUP BY tblBrand.BrandID, tblBrand.BrandName 

Это необходимо будет отредактировать дополнительно, чтобы учесть нулевые объединения, где оценка не существует (возможно, с AVG (ISNULL (tblReview.Grade, 0))). Зависит от ваших требований.

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