【问题标题】:Need assistance with basic sql query需要基本 sql 查询方面的帮助
【发布时间】:2012-03-27 03:54:26
【问题描述】:

我正在做一些练习以进行练习,但我的查询有一个小问题。 我的初始代码如下。问题是我在最后一栏中得到了错误的答案/

问题:查询 2008 年下达的所有 SalesOrders 的每个销售人员的总销售额。使用订单的 TotalDue 查找销售额,使用 SalesPersonID 查找要归属的销售人员。例如。 SalesOrderID 43659 应归属于 SalesPersonID 279。

  SELECT DISTINCT p.BusinessEntityID,p.FirstName,p.LastName,  t.TotalDue
    FROM Person.Person p,Sales.SalesPerson s,Sales.SalesOrderHeader t
    WHERE p.BusinessEntityID = s.BusinessEntityID 

这是我的 ERD http://www.2shared.com/photo/h2-jMQyP/AdventureWorks2008.html 的图像。

【问题讨论】:

  • 如果可能,请发布一些具有所需结果的示例数据.. 这样有助于正确说出查询.. :)
  • 既然你在学习,至少要正确学习,永远不要使用隐式连接。它们的编程技术很差。

标签: sql sql-server tsql erd


【解决方案1】:

这看起来像是使用 GROUP BY 子句的理想示例。

尝试以下查询:

select p.BusinessEntityID, p.FirstName, p.LastName, sum(t.TotalDue) as TotalDue
from Person.Person p
join Sales.SalesPerson s on p.BusinessEntityID = s.BusinessEntityID
join Sales.SalesOrderHeader t on t.BusinessEntityID = s.BusinessEntityID
where year(t.OrderDate) = 2008
group by p.BusinessEntityID, p.FirstName, p.LastName

【讨论】:

    【解决方案2】:

    如果你想在 2008 年完成,你必须为今年部分再提供一个条件

    SELECT DISTINCT p.BusinessEntityID,p.FirstName,p.LastName,  t.TotalDue
    FROM Person.Person p,Sales.SalesPerson s,Sales.SalesOrderHeader t
    WHERE p.BusinessEntityID = s.BusinessEntityID 
    and year(date_column) = '2008'
    

    【讨论】:

    • 我仍然没有弄错销售列这就是我的选择 p.BusinessEntityID, p.FirstName, p.LastName, s.TotalDueFROM Person.Person p, Sales.SalesOrderHeader sWHERE p.BusinessEntityID = s.SalesPersonID AND YEAR(OrderDate) = '2008';.
    • 我认为这个查询返回一个在Person/SalesPersonSalesOrderHeader 之间的笛卡尔积。那是因为SalesOrderHeader 表没有连接条件。
    • -1 用于隐式连接的用户,因此无法识别意外的交叉连接。
    • @HLGEM 接受您的观点......但请参阅我想说的是在检查/提取数据时添加年份部分。 ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多