MS-SQL中联接结果集中的分组依据
我有一个包含特定项目范围的订单行的工作查询,然后加入订单信息MS-SQL中联接结果集中的分组依据,sql,sql-server,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 =
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')
如果在上述查询的末尾添加groupbyorderptelephone,则会出现以下错误
您知道如何根据客户的电话号码进行分组吗?如果您要通过电话进行分组,您需要为每个其他字段进行汇总,或者也可以根据这些字段进行分组:
SELECT MAX(Orders.col1) col1
, MAX(Orders.col2) col2
, Orderp.Telephone
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')
GROUP BY Orderp.Telephone
或:
与MySQL不同,如果SELECT列表中存在列,但GROUP BY子句中不存在列,或者聚合函数(如MAX、SUM..等)未使用列,则会导致查询抛出错误,如上所示 若要删除基于特定字段的重复项(若我理解正确的话,该字段是Orderp.Telephone),可以在分区上使用排名函数,如rownumber、rank、dense\u rank。Sql server 2005+
Select * From
( SELECT Orders.col1, Orders.col2,Orders.col3,Orderp.col1, Orderp.2,
Row_number() Over (partition by Orderp.Telephone order by
Orderp.Storeid) as rownum
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')
) z
WHERE rownum =1
让我们尽力为你解决这个问题 您使用的是一个组,该组通常伴随一个聚合函数。例如,如果我想要我的产品的平均销售额,我会使用 现在,这将显示每个ProductID的平均销售额 这就是您的查询不起作用的原因。您只按一列进行分组,而不对其他列执行聚合 查询的第二个问题是它很懒。键入您希望接收的列。不要使用SELECT*原因是多方面的,一个简单的谷歌搜索会给你很多结果。在您的特定示例中,它会给您带来问题,因为您甚至不知道根据哪些列进行分组 因为您以这种方式使用GROUPBY,所以您可能实际上在寻找对返回的行集进行排序的顺序
希望该解释能帮助您今后避免犯这些错误。如果您从这些表中选择所有数据,则必须按talbe Orders和Orderp中的所有列进行排序。可能按Orderp.Telephone分组,然后按Orders.OrdersID分组?请提供表的字段信息。不能在选择*的情况下使用GROUP BY子句。您必须在SELECT部分中指定字段列表,SELECT子句中的列必须是GROUP BY子句的一部分,除非您使用的是聚合。@RaduGheorghiu我想您的意思是GROUP BY,您可以按任意数量的列排序。显然,我不习惯MSSQL:正如您可能猜到的那样,通常使用MySQL。我已经接受了@Zane的回答。我去掉了通配符,并将所选字段添加到GROUPBY中,效果很好!显然,我不习惯MSSQL:正如您可能猜到的那样,通常使用MySQL。我已经接受了@Zane的回答-谢谢。我去掉了通配符,并将所选字段添加到GROUPBY中,效果很好!
Select * From
( SELECT Orders.col1, Orders.col2,Orders.col3,Orderp.col1, Orderp.2,
Row_number() Over (partition by Orderp.Telephone order by
Orderp.Storeid) as rownum
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')
) z
WHERE rownum =1
SELECT
AVG(Sales),
ProductID
FROM MostGenericTable
GROUP BY ProductID
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