联接表,日期之间的数据

时间:2018-10-30 04:46:43

标签: sql sql-server

我正在使用northwind数据库进行练习:我对sql还是很陌生。 我要解决的问题是:

问: 1996年10月每个客户的总销售额(基于OrderDate)。在[客户ID],[公司名称]和[[总销售额]中显示结果,并在[降序]中按[总销售额]排序。

我使用了此代码,但似乎不正确,请告知。

select c.customerid , c.companyname , o.orderdate , sum(od.unitprice *od.Quantity*1-od.Discount) as totalsales
 from customers as c , orders as o , [Order Details] as od
 where  o.customerid = c.CustomerID
    and o.OrderID = od.OrderID
    and  o.OrderDate >=  '1996/10/01' and  o.orderdate <= '1996/10/31'

 group by c.customerid , c.companyname, o.orderdate
 order by totalsales desc
;


*******************************

1 个答案:

答案 0 :(得分:2)

我怀疑这只是求和函​​数内部的计算方法

SELECT
    c.customerid
  , c.companyname
  , o.orderdate
  , SUM((od.unitprice * od.Quantity) * (1 - od.Discount)) AS totalsales
FROM customers AS c
INNER JOIN orders AS o ON o.customerid = c.CustomerID
INNER JOIN [Order Details] AS od ON o.OrderID = od.OrderID
WHERE o.OrderDate >= '1996-10-01'
AND o.orderdate < '1996-11-01' -- move up one day, use less than
GROUP BY
    c.customerid
  , c.companyname
  , o.orderdate
ORDER BY
    totalsales DESC
;
  • (od.unitprice * od.Quantity)提供总折扣价,然后
  • 折扣率为(1 - od.Discount)
  • (od.unitprice * od.Quantity) * (1 - od.Discount)乘以总折扣价

请注意,我更改了联接的语法!请学习这种更现代的语法。请勿在from子句中的表名之间使用逗号,否则诸如AND o.customerid = c.CustomerID之类的条件将移至ON之后,而不是在where子句中。

此外,SQL Server中最可靠的日期文字是yyyymmdd,次佳的是yyyy-mm-dd。很高兴看到您首先使用年份,但我建议您使用破折号而不是斜杠,或者(甚至更好)不使用定界符。例如

WHERE o.OrderDate >= '19961001'
AND o.orderdate < '19961101'

还请注意,我已经删除了<=并将其替换为<,并将较高的日期移至下个月的第一天。这种方式实际上更容易,因为每个月都有一天,只需使用少于这个较高的日期即可。

相关问题