【问题标题】:Sum and order by date按日期求和并排序
【发布时间】:2018-06-18 03:02:25
【问题描述】:

这是一个问题,我在编写正确的查询时遇到问题,问题下方是我到目前为止所遇到的问题..

列出客户表中的公司名称、联系人姓名、电话号码和国家,以及订单日期在 1992 年 7 月 1 日至 1993 年 6 月 30 日之间的订单表中的运费总和。订购结果由公司名称设置。查询应生成下面列出的结果集。

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.

【问题讨论】:

  • 您需要在日期常量周围加上单引号。另外,用您正在使用的数据库标记您的问题。

标签: sql sql-server


【解决方案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 已显式添加。永远不要“假设”结果将按特定顺序排列。
  • OrderDate 已从 SELECT 中删除。它与问题无关,并且会妨碍公司汇总。
  • 日期常量有单引号。
  • 日期逻辑已更改以避免BETWEEN。即使日期上有时间分量,上述逻辑也有效。这很有帮助,因为很容易忘记用于日期常量(或其他人将时间从日期更改为日期/时间)的确切数据类型。

【讨论】:

  • 啊,是的,现在说得通了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多