Member 14800672 Ответов: 2

Как мне получить среднее значение


<pre lang="text">I have two tables
  
 Rating   RatingDescription
      1         poor
      2         good
      3         vgood
      4         excellent 



Customer       Rating
       1            1
       1            2
       2            5
       3            3
       3            3


Now i want to get the average rating for each customer

Customer AvgRating   RatingDescription
1          1.5         bad
3          3.5      very good(if it was 3.9 it should be very good not excellent)
3          3         very good


Что я уже пробовал:

select
    max(Customer) as cust
	,max(RatingDetails.Description) as descr
	,AVG(CAST(testttt.rating AS float)) as RatingAvg
From customer
	join Rating 
		on Rating.Rating = floor(AVG(CAST(customer.rating AS float)))
group by customer



это могут быть простые данные, но я хочу иметь возможность взять целочисленное значение из avg, а затем взять описание, я попробовал его с помощью "having", но безуспешно

2 Ответов

Рейтинг:
2

OriginalGriff

Попробуй:

SELECT a.Customer, a.Average, b.RatingDescription
FROM (SELECT Customer, AVG(CAST(Rating AS FLOAT)) AS Average
      FROM Customer
      GROUP BY Customer) a 
JOIN Rating b ON CAST (a.Average AS INT) = b.Rating
Но вам нужно будет расширить свою рейтинговую таблицу, чтобы включить в нее все возможные целочисленные значения!


Maciej Los

5ed!

Рейтинг:
0

MadMyche

Вы также можете сделать это с помощью CTE, заполняя его клиентским и средним рейтингом.
Тогда бы вы это сделали JOIN этот CTE вместе с таблицей рейтингов.

доказательство концепции:

DECLARE @Ratings TABLE ( Rating Decimal(5,1) NULL, RatingDesc NVARCHAR(16) NULL )
INSERT @Ratings VALUES (1, 'poor'), (2, 'good'), (3, 'v-good'), (4, 'excellent'), (5, 'Off the chart')

DECLARE @Reviews TABLE ( Customer INT NULL, Rating Decimal(5,1) NULL)
INSERT @Reviews VALUES (1, 1), (1,2), (2, 5), (3,3), (3,3)

; WITH cte AS (
     SELECT   Customer, AvgRating = Cast(Avg(Rating) as Decimal(5,1))
     FROM     @Reviews
     GROUP BY Customer
)

SELECT	 cte.*, rv.RatingDesc
FROM		 cte
INNER JOIN @Ratings rv
      ON   cte.AvgRating BETWEEN rv.Rating - 0.1 AND rv.Rating + 0.9


Maciej Los

5ed!