SQL sum聚合函数给出了错误的结果

时间:2018-03-26 11:16:19

标签: sql sql-server

我的数据如下:

  

正确答案是Sum = 601,050.00

但SQL sum聚合函数给出了错误的答案,即5078150.00000

15,000.00
27,950.00
每年24,750.00¥11,550.00¥7,400.00¥7,500.00¥14,650.00¥12,500.00¥32,800.00
35,700.00 < br /> 94,100.00
10,100.00
19,700.00
22,100.00
35,450.00
28,050.00
50,150.00¥69,750.00
13,800.00
3,600.00 < br /> 18,600.00
2,350.00

¥7,200.00
21,600.00
7,700.00
4,500.00
2,500.00

select  sum(SO_SalesOrder.OrderTotal),l.Name as [Store Name]
    From SO_SalesOrder inner join BASE_Location l on 
    SO_SalesOrder.LocationId = l.LocationId 
    inner join SO_SalesOrder_Line on SO_SalesOrder.SalesOrderId = 
    SO_SalesOrder_Line.SalesOrderId
    inner join BASE_Product on BASE_Product.ProdId = 
    SO_SalesOrder_Line.ProdId
    inner join BASE_Category on BASE_Category.CategoryId = 
    BASE_Product.CategoryId
    where SO_SalesOrder.OrderDate >= '2018-02-01' and 
    SO_SalesOrder.OrderDate <= '2018-02-28' and BASE_Category.Name = '1MHNZ'
    group by l.Name

2 个答案:

答案 0 :(得分:1)

您的一个(或多个)联接可能存在问题,可能是您有重复的行或者加入条件不正常。

删除group by l.NameSUM()聚合,看看SO_SalesOrder.OrderTotal的返回值是否与您期望的一样(您可能需要使用特定{{1}进行过滤在l.Name子句中。您很可能会看到重复的金额,或者在到达值WHERE时未考虑的金额。

如果是这样,请尝试逐个加入表格,看看哪些表格会让你的行变为comando。

答案 1 :(得分:1)

在我看来,你的问题取决于查询的逻辑。

SO_SalesOrderSO_SalesOrder_line加入SalesOrderId列之间的主 - 明细关系。

因此,如果您的订单中有三行,则总计相同OrderTotal的三倍。

尝试这样的事情:

select  sum(SO_SalesOrder.OrderTotal) Total, l.Name as [Store Name]
From SO_SalesOrder 
join BASE_Location l on SO_SalesOrder.LocationId = l.LocationId 
where SO_SalesOrder.OrderDate >= '2018-02-01' and SO_SalesOrder.OrderDate <= '28-02-2018' 
and exists (
    select 0 x
    From SO_SalesOrder_Line 
    join BASE_Product on BASE_Product.ProdId = SO_SalesOrder_Line.ProdId
    join BASE_Category on BASE_Category.CategoryId = BASE_Product.CategoryId
    where BASE_Category.Name = '1MHNZ'
    and SO_SalesOrder_Line.SalesOrderId = SO_SalesOrder.SalesOrderId
)
group by l.Name

P.S。 还要检查日期列,如果它们还包含时间分数,则应重新考虑上限过滤器。

我建议您使用and SO_SalesOrder.OrderDate < '01-03-2018'代替&lt; = 28-02