2012-02-01 7 views
0

У меня есть хранимая процедура, я не могу добраться до работы:ВЫБЕРИТЕ СЛУЧАЙ с Псевдонима в SQL Server 2008

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 

я получаю результат multiplyed с тремя becouse BrandID 1 существуют 3 раза в tblBrandInCategoiry.

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

+0

Я думаю, что вам нужно изменить ваш вопрос. tblReview, в вашем запросе, не входит в схему, которую вы видите под ней. – Random

+0

Okey, его обновленный – user1007103

+0

Что такое схема просмотра tblreview? – Pankaj

ответ

0

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

AverageGrade не может быть использована в качестве колонки для сортировки, пока ваш главный запрос не является Sub Query ....

я получаю результат multiplyed с тремя becouse 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 

Final Resultset

enter image description here

+0

Okey, есть ли другой способ заказать на среднем уровне? – user1007103

+0

Проверьте мой обновленный ответ ... – Pankaj

+0

Спасибо, очень!Прекрасно работает! Теперь мне просто нужно разобраться в Ордене, но это здорово, спасибо! – user1007103

0

Просто отредактируйте ВЫБРАТЬ, чтобы оставить от 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))). Зависит от ваших требований.

+0

Okey, я получаю результат в мультилированном виде. COUNT (tblReview.ReviewID) AS Review в три раза больше, чем должно быть. – user1007103

+0

Я думаю, что вы говорите, что вы получаете три строки для этого бренда. Я обновил свой ответ, когда понял, что вам вообще не нужно вступать в tblBrandinCategory. Это должно исправить ваш результирующий набор. – Random

+0

Это отлично работает, но мне нужно присоединиться к этому табуляту, потому что мне нужен код категории, извините, я не упоминал об этом. – user1007103

Смежные вопросы