SQL Spatial子查询问题

时间:2017-11-12 22:12:43

标签: sql sql-server spatial

问候Stackoverflow的仁慈之神,

我目前正在努力获得一个空间启用的查询,以便为我正在进行的SQL任务工作。措辞如下:

SELECT        PURCHASES.TotalPrice, STORES.GeoLocation, STORES.StoreName
FROM          MuffinShop
            join (SELECT SUM(PURCHASES.TotalPrice) AS StoreProfit, STORES.StoreName
FROM            PURCHASES INNER JOIN STORES ON PURCHASES.StoreID = STORES.StoreID
GROUP BY STORES.StoreName
HAVING        (SUM(PURCHASES.TotalPrice) > 600))

我正在尝试使用此查询执行函数查询(如avg,sum等)并获取空间信息。另一个例子是:

SELECT        STORES.StoreName, AVG(REVIEWS.Rating),Stores.Shape
FROM            REVIEWS CROSS JOIN
                         STORES
GROUP BY STORES.StoreName;

这会返回Column 'STORES.Shape' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.错误消息。

我知道我需要一个子查询来执行此任务,我只是无法让它工作。任何帮助都会受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

这个问题有两个部分,我将用以下逻辑解决第一个问题:

  1. 列出所有商店名称及其各自的地理位置
  2. 获取每家商店的利润
  3. 考虑到这一点,您需要使用STORES表作为基础,然后通过子查询或应用将利润固定在其上:

    SELECT  s.StoreName
           ,s.GeoLocation
           ,p.StoreProfit
    FROM    STORES s
            INNER JOIN (
                        SELECT  pu.StoreId
                               ,StoreProfit = SUM(pu.TotalPrice)
                        FROM    PURCHASES pu
                        GROUP BY pu.StoreID
                       ) p
                ON p.StoreID = s.StoreID;
    

    这个效率更高一点:

    SELECT  s.StoreName
           ,s.GeoLocation
           ,profit.StoreProfit
    FROM    STORES s
            CROSS APPLY (
                         SELECT StoreProfit = SUM(p.TotalPrice)
                         FROM   PURCHASES p
                         WHERE  p.StoreID = s.StoreID
                         GROUP BY p.StoreID
                        ) profit;
    

    现在对于第二部分,您收到的错误告诉您,除了您的聚合函数之外,您需要在select语句中GROUP BY 所有列。

    在第二个示例中,您要求SQL根据ID对每个商店进行平均评级,但您也尝试返回另一列而不将其包含在分组中。我将尝试通过以下示例向您展示您要求SQL执行的操作以及问题所在:

    -- Data
    Id | Rating | Shape
    1  | 1      | Triangle
    1  | 4      | Triangle
    1  | 1      | Square
    2  | 1      | Triangle
    2  | 5      | Triangle
    2  | 3      | Square
    

    SQL Server,请给我每家商店的平均评分:

    SELECT  Id, AVG(Rating)
    FROM    Store
    GROUP BY StoreId;
    
    -- Result
    Id | Avg(Rating)
    1  | 2
    2  | 3
    

    SQL Server,请给我每个商店的平均评分,并在结果中显示其形状(但不要由它组成):

    SELECT  Id, AVG(Rating), Shape
    FROM    Store
    GROUP BY StoreId;
    
    -- Result
    Id | Avg(Rating) | Shape
    1  | 2           | Do I show Triangle or Square ...... ERROR!!!!
    2  | 3           |
    

    需要告诉我们获得每个商店的平均值和形状:

    SELECT  Id, AVG(Rating), Shape
    FROM    Store
    GROUP BY StoreId, Shape;
    
    -- Result
    Id | Avg(Rating) | Shape
    1  | 2.5         | Triangle
    1  | 1           | Square
    2  | 3           | Triangle
    2  | 3           | Square
    

答案 1 :(得分:0)

在任何空间查询中,您都需要了解最终的几何形状。看起来您正在尝试按单个商店分组,但是从子查询中提供平均评分。因此,如果我没看错,您只是在寻找与平均评分相关的商店形状信息?

在stores表中查询shape字段,并加入用于获得平均评分的查询

select a.shape
 b.*
from stores a inner join (your Average rating query with group by here) b
on a.StoreID = b.Storeid