none
Error en Select Count(*) RRS feed

  • Pregunta

  • Hola ...

    Tengo la siguiente consulta , pero en el campo NumberReview  deberiar devolver 1 y devuelve 2

     DECLARE @position geography;
        SET @position=geography::STGeomFromText('POINT (-73.9844722 40.759011)', 4326);
     WITH CTE AS ( SELECT  A.RestaurantID, MIN(B.price) Price FROM  Items A  INNER JOIN Priceitem B ON A.ItemID = B.ItemId  AND B.price <> 0 GROUP BY A.RestaurantID )
                             SELECT ISNULL(D.Price, 0) AS MinPrice, A.RestaurantId,A.RestaurantName, A.StreetAddress,A.Phone, A.Delivery,
                             CASE WHEN A.Logo IS NULL OR A.Logo ='logo' THEN '../Delivery/img/avatar2.jpg' ELSE CONCAT('https://sabor.blob.core.windows.net/restaurantslogo/', A.Logo, '.png') END Logo,
                             FORMAT(CONVERT(DATETIME, B.HoursEnd), 'hh:mm:tt') AS HoursEnd , ((AVG(E.FoodQuality) + AVG(E.Price) + AVG(E.Punctuality) + AVG(E.Courtesy))/4) AS RatingAvg , COUNT(E.RestaurantId) AS NumberReview
                             FROM  Restaurant A INNER JOIN RestaurantHours B ON A.RestaurantId = B.RestaurantId AND B.HoursType = 'Delivery'
                             INNER JOIN DeliveryConfiguration C ON A.RestaurantId = C.RestaurantId
                             INNER JOIN RestaurantReview E ON A.RestaurantId =E.RestaurantId
                             LEFT JOIN CTE D ON (A.RestaurantID = D.RestaurantID)  
                             WHERE  B.WeekDay = DATENAME(WeekDay, GETDATE()) AND C.Position.STDistance(@position) IS NOT NULL AND C.Position.STDistance(@position) <= C.Position.STDistance(@position)
                             GROUP BY D.Price,A.RestaurantId,A.RestaurantName, A.StreetAddress,A.Phone, A.Delivery,A.Logo,B.HoursEnd ORDER BY RatingAvg DESC ;

     

    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    sábado, 22 de octubre de 2016 21:21

Respuestas

  • Efrain Mejias Castillo,

    Lo simple será agregar subconsultas en la lista de selección.

        ---<...>
        (SELECT AVG(E.FoodQuality + E.Price + E.Punctuality + E.Courtesy) 
    	   FROM RestaurantReview WHERE A.RestaurantId = E.RestaurantId) AS RatingAvg,
        (SELECT COUNT(E.RestaurantId) 
    	   FROM RestaurantReview WHERE A.RestaurantId = E.RestaurantId) AS NumberReview
    FROM 
        Restaurant AS A
        INNER JOIN RestaurantHours AS B ON A.RestaurantId = B.RestaurantId
    	   AND B.HoursType = 'Delivery'
        INNER JOIN DeliveryConfiguration AS C ON A.RestaurantId = C.RestaurantId    
        LEFT JOIN CTE AS D ON A.RestaurantID = D.RestaurantID
    WHERE 
        ---<...>

    Respecto a tu solicitud, no conozco la correspondencia de cardinalidad entre las tablas que participan en la consulta, por tanto no tengo el criterio suficiente para saber que relación es la que está multiplicando las filas resultantes, sospecho que es la tabla 'RestaurantHours' mas no tengo certeza.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 23 de octubre de 2016 17:23

Todas las respuestas

  • Efrain Mejias Castillo,

    Es posible que la operación de combinación haya producido filas duplicadas que son consideradas por la función COUNT(), nota además que el resultado de operar con la función AVG() no evidencia el mismo problema dado que la media aritmética para los valores duplicados considera el total de los sumandos (para la suma y división). Intenta realizar el siguiente cambio:

    AVG(E.FoodQuality + E.Price + E.Punctuality + E.Courtesy) AS RatingAvg, 
    COUNT(DISTINCT E.RestaurantId) AS NumberReview


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 22 de octubre de 2016 23:55
  • Hola... Willams Morales

    Si agrego el DISTINCT  me devuelve 1 para todos los registros... 

    Como podria ser , para obtener el Count(E.RestaurantReview) Como una subconsulta ,Algo asi como en CTE


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    domingo, 23 de octubre de 2016 16:14
  • Efrain Mejias Castillo,

    Lo simple será agregar subconsultas en la lista de selección.

        ---<...>
        (SELECT AVG(E.FoodQuality + E.Price + E.Punctuality + E.Courtesy) 
    	   FROM RestaurantReview WHERE A.RestaurantId = E.RestaurantId) AS RatingAvg,
        (SELECT COUNT(E.RestaurantId) 
    	   FROM RestaurantReview WHERE A.RestaurantId = E.RestaurantId) AS NumberReview
    FROM 
        Restaurant AS A
        INNER JOIN RestaurantHours AS B ON A.RestaurantId = B.RestaurantId
    	   AND B.HoursType = 'Delivery'
        INNER JOIN DeliveryConfiguration AS C ON A.RestaurantId = C.RestaurantId    
        LEFT JOIN CTE AS D ON A.RestaurantID = D.RestaurantID
    WHERE 
        ---<...>

    Respecto a tu solicitud, no conozco la correspondencia de cardinalidad entre las tablas que participan en la consulta, por tanto no tengo el criterio suficiente para saber que relación es la que está multiplicando las filas resultantes, sospecho que es la tabla 'RestaurantHours' mas no tengo certeza.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 23 de octubre de 2016 17:23