una suma sacar promedio funcion como campo calcular agregados sql sql-server sql-server-2008 select average

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;