【问题标题】:Adventure Works 2014 SQL QueriesAdventure Works 2014 SQL 查询
【发布时间】:2017-10-30 21:29:55
【问题描述】:

我正在使用 Adventure Works 2014 数据库编写 SQL 查询。

我想显示所有客户以及每个客户有多少订单。

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

select  s.CustomerID ,p.FirstName +' '+p.LastName as Name 
from Sales.Customer s,Person.Person p 
where s.CustomerID=p.BusinessEntityID
order by s.CustomerID


select CustomerID ,count(SalesOrderID) as OrdersCount
from Sales.SalesOrderHeader
group by CustomerID

【问题讨论】:

标签: mysql sql adventureworks


【解决方案1】:
 SELECT s.CustomerID ,
        p.FirstName +' '+p.LastName as Name,
        count(SalesOrderID)
 FROM Sales.Customer s
 JOIN Person.Person p 
   ON s.CustomerID=p.BusinessEntityID
 LEFT JOIN Sales.SalesOrderHeader so
   ON s.Customer_ID = so.Customer_ID  
 GROUP BY s.CustomerID ,
        p.FirstName +' '+p.LastName as Name 
 order by s.CustomerID

【讨论】:

  • 感谢您的回答,问题是有很多客户没有下订单,所以他们没有出现在这个查询中
  • @GeorgeKouki 试试left join
【解决方案2】:

我添加 CONCAT 可能对你来说是新东西。无论如何,OVER(PARTITION BY column_name) 子句被用作 GROUP BY 的替代品,因为您打印的列多于 GROUP BY 子句所允许的列数。

【讨论】:

  • 欢迎来到 Stackoverflow!请不要将代码(在本例中为完整查询)添加为图像。这使得无法直接复制或在您的帖子中进行编辑:)
【解决方案3】:

表 Sales.Customer 参考:Person.Person (PersonID -> BusinessEntityID)

SELECT s.CustomerID 
        ,p.FirstName +' '+p.LastName as Name
        ,COUNT(so.SalesOrderDetailID)
 FROM Sales.Customer s
 JOIN Person.Person p 
   ON s.PersonID=p.BusinessEntityID
 LEFT JOIN Sales.SalesOrderHeader h 
   ON h.CustomerID = s.CustomerID
 LEFT JOIN Sales.SalesOrderDetail so
   ON so.SalesOrderID = h.SalesOrderID
 GROUP BY s.CustomerID ,
        p.FirstName +' '+p.LastName
 order by s.CustomerID

【讨论】:

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