我正在使用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
;
*******************************
答案 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'
还请注意,我已经删除了<=
并将其替换为<
,并将较高的日期移至下个月的第一天。这种方式实际上更容易,因为每个月都有一天,只需使用少于这个较高的日期即可。