suma - calcular la calificación promedio en el servidor sql
promedio de una suma sql (2)
esta es mi mesa:
Quiero buscar registros de Aquellos proveedores que contengan ServiceDescription "Plaster" o Skills "Plaster" o que estén en la categoría "Plaster" y también quieran calcular la mediación de esos proveedores.
Nota: Si no hay una revisión de ningún proveedor, entonces también deben aparecer los registros.
esta es mi consulta:
select * from UserDetails u
,VendorInCategory v
,CategoryMaster c
,Review rv
where v.CategoryId=c.Id
and u.Id=r.UserId
and u.Id=rv.VendorId
and v.VendorId=u.Id
and ((u.ServiceDescription like ''%Plaster%'' )
or (u.Skills like ''%Plaster%'')
or (c.Name like ''%Plaster%''))
aquí el problema en la consulta anterior es que no estoy obteniendo ese proveedor cuya revisión no está allí.
pero también quiero ese proveedor que no contenga revisión pero que coincida con mis criterios.
Detalles de usuario:
id Servicedescription Skills
1 Plaster plaster
2 construction construvtion
3 plaster plaster
4 null null(not vendor)
5 null null(not vendor)
revisión
id CustomerId Vendorid rating
1 4 1 3
2 5 1 3
Rendimiento esperado:
VendorId ServiceDescription Skills averagerating
1 plaster plaster 3
3 plaster plaster 0
Nota: el resultado final debe ser en orden descendente de calificación promedio
Aquí, prueba esto:
DATA DE MUESTRA
create table UserDetails(
Id int,
ServiceDescription varchar(20),
Skills varchar(20)
)
create table Review(
Id int,
CustomerId int,
VendorId int,
Rating int
)
insert into UserDetails values(1, ''Plaster'', ''plaster''),(2, ''construction'', ''construction''),(3, ''plaster'', ''plaster'');
insert into Review values(1, 4, 1, 3),(2, 5, 1, 3);
SOLUCIÓN
select
u.Id as VendorId,
u.ServiceDescription,
u.Skills,
isnull(sum(r.rating)/count(r.rating), 0) as AverageRating
from UserDetails u
left join Review r
on r.VendorId = u.id
where
u.ServiceDescription like ''%plaster%''
or u.Skills like ''%plaster%''
group by
u.Id,
u.ServiceDescription,
u.Skills
order by AverageRating desc
Use la función agregada AVG () :
Prueba esto:
SELECT u.id, u.ServiceDescription, u.Skills, u.fullname, u.email, AVG(ISNULL(rv.rating, 0)) averagerating
FROM UserDetails u
INNER JOIN VendorInCategory v ON v.VendorId=u.Id
INNER JOIN CategoryMaster c ON v.CategoryId=c.Id
LEFT JOIN Review rv ON u.Id=rv.VendorId
WHERE (u.ServiceDescription LIKE ''%Plaster%'' OR u.Skills LIKE ''%Plaster%'' OR
c.Name LIKE ''%Plaster%'')
GROUP BY u.id, u.ServiceDescription, u.Skills, u.fullname, u.email
ORDER BY averagerating DESC;
EDITAR
Otra solución para implementar esto:
SELECT u.id, u.ServiceDescription, u.Skills, u.fullname, u.email,
ISNULL(rv.averagerating, 0) averagerating
FROM UserDetails u
INNER JOIN VendorInCategory v ON v.VendorId=u.Id
INNER JOIN CategoryMaster c ON v.CategoryId=c.Id
LEFT JOIN (SELECT rv.VendorId, AVG(rv.rating) averagerating FROM Review rv GROUP BY rv.VendorId) rv ON u.Id=rv.VendorId
WHERE (u.ServiceDescription LIKE ''%Plaster%'' OR u.Skills LIKE ''%Plaster%'' OR
c.Name LIKE ''%Plaster%'')
ORDER BY ISNULL(rv.averagerating, 0) DESC;