按日期求和

时间:2018-06-17 18:56:52

标签: sql sql-server

这是一个问题,我在编写正确的查询时出现问题,问题是我到目前为止...

列出来自Customers表的公司名称,联系人姓名,电话号码和国家/地区,以及订单日期为1992年7月1日至1993年6月30日的订单表中的运费总和。订购结果由公司名称设定。查询应生成下面列出的结果集。

enter image description here

SELECT          Customers.CompanyName,
                 Customers.ContactName,
                 Customers.Phone,
                 Customers.Country,
                 SUM(Orders.Freight) AS Total_Freight,
                 Orders.OrderDate
FROM            Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE           Orders.OrderDate BETWEEN '1992-07-01' and '1993-06-30'
GROUP BY        Customers.CompanyName

我收到此错误:

Msg 8120, Level 16, State 1, Line 2
Column 'Customers.ContactName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

1 个答案:

答案 0 :(得分:1)

您的查询存在多个问题。 。 。但你很亲密我建议:

SELECT c.CompanyName, c.ContactName, c.Phone, c.Country,
       SUM(o.Freight) AS Total_Freight
FROM Customers c INNER JOIN
     Orders o
     ON c.CustomerID = o.CustomerID
WHERE o.OrderDate >= '1992-07-01' AND
      o.OrderDate < '1993-07-01'
GROUP BY c.CompanyName, c.ContactName, c.Phone, c.Country
ORDER BY c.CompanyName;

注意:

  • 也许最明显的变化是使用表别名。这些使查询更容易编写和阅读。
  • 所有非聚合列都在GROUP BY
  • 明确添加了ORDER BY。从不&#34;假设&#34;结果将按特定顺序排列。
  • OrderDate已从SELECT中删除。它与问题无关,它妨碍了公司汇总。
  • 日期常量有单引号。
  • 日期逻辑已更改为避免BETWEEN。即使日期上有时间组件,上述逻辑仍然有效。这很有用,因为很容易忘记用于日期常量的确切数据类型(或者其他人将时间从日期更改为日期/时间)。