【问题标题】:Adventure Works SQL Server 2014 EnquiryAdventure Works SQL Server 2014 查询
【发布时间】:2017-10-31 13:22:15
【问题描述】:

我正在使用 AdventureWorks 2014 数据库编写 SQL 查询。我想显示哪个员工的订单价值最高。

我尝试自己编写每个 select 语句(见下文),但我希望能够将两个查询合并为一个:

select 
    s.SalesOrderID, s.SalesPersonID, COUNT(sd.SalesOrderID) as count 
from 
    Sales.SalesOrderHeader s, Sales.SalesOrderDetail sd
where 
    s.SalesOrderID = sd.SalesOrderID 
group by           
    sd.SalesOrderID, s.SalesOrderID, s.SalesPersonID 
order by 
    sd.SalesOrderID

select 
    sd.SalesOrderID, sd.LineTotal, count (sd.SalesOrderID) as count 
from 
    Sales.SalesOrderDetail sd
group by 
    sd.SalesOrderID, sd.LineTotal 
order by 
    sd.SalesOrderID

【问题讨论】:

  • 这 2 个查询是否有效?最高订单价值,我认为是SUM() 函数。从Group By 中删除sd.SalesOrderID,因为这是一个聚合。
  • 从顶部查询中删除 s.SalesOrderID 以获得每个 s.SalesPersonIDCount()。从SelectGroup By 中删除。将Order By 更改为s.SalesPersonID
  • @WEI_DBA 你能把新的查询写给我吗
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它

标签: sql sql-server adventureworks


【解决方案1】:

您是否正在寻找类似的东西:

select top 1  
    s.SalesPersonID
    ,sum(sd.LineTotal ) as orderTotal
    s.salesorderid
from
    Sales.SalesOrderHeader s
    inner join  Sales.SalesOrderDetail sd
        on s.SalesOrderID = sd.SalesOrerID
group by 
    s.SalesPersonID
    s.salesorderid
order by
    orderTotal desc

在 SQL Server 中,您可以只使用 top 函数请求有限数量的行(这可以在正确排序时为您提供最高顺序值)。这可以与 group by 一起使用,它将所有在被分组的列中具有相同值的行总计加在一起。

【讨论】:

  • @PrabhatG 不必要的神秘评论。需要修改
  • 是吗?我跑了。输出错误。 s.salesorderid 不应该在 group by 子句中,因为它会混淆输出。
  • @PrabhatG“我想显示哪个员工的订单价值最高”我认为这意味着他们正在寻找销售最高价值订单的员工......这需要按销售订单分组没有?
  • @PrabhatG fwiw 这将是一个逻辑错误,而不是任何一种语法;)缺少的逗号是语法错误 XD
  • @gordatron:我将其解释为拥有最大 LineTotal 的员工。无论如何,既然 OP 已经标记了你的权利,我想你的解释比我的更有意义。干杯。语法错误清晰可见,没有“加密”:P我只是不确定逻辑。
【解决方案2】:

这就是我要做的,得到每个销售人员的总数。按Sum(sd.LineTotal) 降序排列以获得最高值。

select s.SalesPersonID ,COUNT(sd.SalesOrderID) as count,sum(sd.LineTotal ) as orderTotal  
from Sales.SalesOrderHeader s 
Inner Join Sales.SalesOrderDetail sd ON s.SalesOrderID=sd.SalesOrderID 
group by s.SalesPersonID 
order by 3 Desc

【讨论】:

    【解决方案3】:

    我们感谢您的努力。但是,有一种更简单的方法可以得到您的答案。

    SELECT 
    -- TOP 1   //to get highest order total
     s.SalesPersonID
     ,COUNT(sd.SalesOrderID) as Total_Count
     ,sum(sd.LineTotal) as orderTotal  
    FROM 
      Sales.SalesOrderHeader s Inner Join Sales.SalesOrderDetail sd 
      ON s.SalesOrderID=sd.SalesOrderID 
    GROUP BY s.SalesPersonID 
    HAVING s.SalesPersonID IS NOT NULL
    ORDER BY sum(sd.LineTotal) desc
    

    我正在做的是,通过SalesOrderId 加入SalesOrderHeaderSalesOrderDetail 并使用aggregate functions 来获得所需的结果。

    Order by 用于首先获得最高值。 Top 1 仅用于获取所需的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多