这是一个带有GROUP BY和ORDER BY的SQL连接,它将生成#order的报告,但它不起作用

时间:2013-08-30 15:32:43

标签: mysql sql sql-server

这是架构:

create table Retailer (
    row bigint,
    id uniqueidentifier,
    name varchar(255),
    domainName varchar(MAX)
)

create table SalesPeople
( Row bigint not null identity,
  ID uniqueidentifier not null,
  Retailer_ID uniqueidentifier not null,
  FirstName nvarchar(255) not null,
  LastName nvarchar(255) not null,
  EmailAddress nvarchar(511) ,
  PhoneNumber nvarchar(255) 
 )

orders (
    row bigint,
    id uniqueidentifier,
    Retailer_ID uniqueidentifier,
    salesperson_id uniqueidentifier,
    prod_id uniqueidentifier,
    date datetime
)

我们正在设计一个查询,报告销售人员以及他们为特定零售商生成的订单数量。此外,如果马克和比尔被捆绑,但比尔斯的订单更近,比尔将需要出现在马克之上。此外,生成大多数订单的人需要显示在列表的最顶层。

据零售商EBAY说,销售数据显示,约翰在2012年1月订购了2000个订单,比尔在2010年1月订购了999个订单,在2013年8月订购了1个订单,而马克在2013年6月订购了1000个订单,并且Marry 2010年7月订购了700份订单,​​2013年7月订购了150份订单。产量看起来像这样:

 Sales Person        #ofOrdersCreate    
 John                 2000
 Bill                 1000
 Mark                 1000
 Marry                 850

我们尝试的查询是:

select s.firstname + ' '+s.LastName ,   COUNT(o.id) from Orders o 
  inner join SalesPeople s on s.ID=o.Retailer_ID 
  inner join Retailers r on r.id = o.retailer_id
   where r.name='EBAY'
   group by s.firstname + ' '+s.LastName
    order by o.date

但是我们从上面的join语句中得到错误,因为我们无法对数据进行排序,因为它不包含在聚合函数或GROUP BY子句中。

2 个答案:

答案 0 :(得分:1)

您有两个问题:

  1. 因为您的分组结果将包含多个可能的日期,您需要在顺序中包含字段(这不适用于您尝试完成的任务)或在返回的结果组上使用聚合函数(例如sum或您的要求max)。
  2. 您的group by应该在集体列s.firstname, s.lastname上,而不是它们的聚合。
  3. 所以这样修理:

    select s.firstname + ' '+s.LastName ,   COUNT(o.id) from Orders o 
    inner join SalesPeople s on s.ID=o.Retailer_ID 
    inner join Retailers r on r.id = o.retailer_id
    where r.name='EBAY'
    group by s.firstname, s.LastName
    order by count(o.id) DESC, max(o.date)
    

答案 1 :(得分:1)

请立即尝试:

select s.firstname + ' '+s.LastName ,   COUNT(o.id) from Orders o 
inner join SalesPeople s on s.ID=o.Retailer_ID 
inner join Retailers r on r.id = o.retailer_id
where r.name='EBAY'
group by s.firstname + ' '+s.LastName
order by COUNT(o.id)