Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS-SQL中联接结果集中的分组依据_Sql_Sql Server - Fatal编程技术网

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