JOIN的结果集中的GROUP BY在MS-SQL中

Phl*_*lip -2 sql sql-server

我有一个包含特定范围项目的订单行的查询,然后我加入订单信息.

SELECT Orders.*, Orderp.*
FROM Orders 
INNER JOIN
    Orderp ON Orderp.StoreID = Orders.StoreID 
  AND 
    Orderp.[Date] = Orders.[Date] 
  AND 
    Orderp.OrderNumber = Orders.OrderNumber
WHERE
    (Orders.ItemType = 2)
  AND 
    (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
  AND 
    (Orders.[Date] > '2013/01/01')
Run Code Online (Sandbox Code Playgroud)

如果我GROUP BY Orderp.Telephone在上面的查询结束时添加,我会收到以下错误.在此输入图像描述

有没有想法如何分组客户的电话号码?

Zan*_*ane 5

让我们尽力为您解决这个问题.

您正在使用GROUP BY通常伴随聚合函数的a.例如,如果我想要我的产品的平均销售额,我会使用.通过...分组

SELECT
    AVG(Sales),
    ProductID
FROM MostGenericTable
GROUP BY ProductID
Run Code Online (Sandbox Code Playgroud)

现在,这将显示每个人的平均销售额ProductID.

这就是您的查询不起作用的原因.您只需按一列进行分组,而不会对其他列进行聚合.

你的查询的第二个问题是它是懒惰的.输入您希望收到的列.不要使用SELECT *的原因很多,简单的谷歌搜索会给你无数的结果.在您的具体示例中,它会给您带来问题,因为您甚至不知道哪些列Group By.

由于您Group By以这种方式使用,因此您可能实际上正在查找ORDER BY哪个将对返回的行集进行排序.排序依据

SELECT 
    Orders.*, 
    Orderp.*
FROM Orders 
INNER JOIN Orderp 
ON Orderp.StoreID = Orders.StoreID 
  AND Orderp.[Date] = Orders.[Date] 
  AND Orderp.OrderNumber = Orders.OrderNumber
WHERE (Orders.ItemType = 2)
  AND (Orders.ItemNumberOnMenu IN (68, 69, 70, 71, 72)) 
  AND (Orders.[Date] > '2013/01/01')
ORDER BY Orderp.Telephone
Run Code Online (Sandbox Code Playgroud)

希望这个解释可以帮助你在将来不犯这些错误.