GROUP BY未返回正确的总计

时间:2014-03-28 18:18:52

标签: sql tsql sql-server-2000

我有这个问题,我一直在搞乱,似乎无法看到要改变什么才能收到我想要的结果。

我希望按天计算Emp_ID的销售额,但只计算那天超过10000美元的销售额。以下是我目前的情况

SELECT
    Emp_ID,
    sum(SaleA+SaleB) as TotalSales,
    sum(SaleA+SaleB-CommA-CommB) as TSalesAftComm,
    count(Emp_ID) as NumOfSales,
    SaleDate
FROM
    Sales (nolock)
WHERE
    SaleDate>='2014-03-15 00:00:00'
GROUP BY 
    SaleDate, Emp_ID
HAVING
    sum(SaleA+SaleB) > 10000
ORDER BY
    SaleDate

我知道在我的选择和分组依据(Emp_ID)中,它将按日期分组,并且还将分组该日期的Emp_ID。看来如果我删除SELECT和GROUP BY区域中的Emp_ID,它会将当天的所有销售额添加到10000美元以下。

以下是我得到的结果

Emp_ID | TotalSales | TSalesAftComm | NumOfSales | SaleDate
   1      10897.65      10000             6        2014-03-15 00:00:00.000
   1      18897.65      17800             8        2014-03-15 00:00:00.000
   2      10797.65      10000             5        2014-03-15 00:00:00.000
   1      10897.65      10000             6        2014-03-16 00:00:00.000

我希望将结果视为

       | TotalSales | TSalesAftComm | NumOfSales | SaleDate
          40592.95      37800             19        2014-03-15 00:00:00.000
          10897.65      10000              6        2014-03-16 00:00:00.000

感谢您提供任何帮助或指示。

3 个答案:

答案 0 :(得分:3)

不要使用SQL Server 2000进行测试,但 应该能够使用普通的子查询完成它,例如;

SELECT SUM(TotalSales) TotalSales, SUM(TSalesAftComm) TSalesAftComm,
       SUM(NumOfSales) NumOfSales, SaleDate
FROM (
  SELECT
      Emp_ID,
      sum(SaleA+SaleB) as TotalSales,
      sum(SaleA+SaleB-CommA-CommB) as TSalesAftComm,
      count(Emp_ID) as NumOfSales,
      SaleDate
  FROM Sales (nolock)
  WHERE SaleDate>='2014-03-15 00:00:00'
  GROUP BY SaleDate, Emp_ID
  HAVING
      sum(SaleA+SaleB) > 10000
) z
GROUP BY SaleDate
ORDER BY SaleDate

答案 1 :(得分:1)

不查看实际数据/架构,并查看您的预期结果,如果您尝试这样做会发生什么(查看分组,按TotalSales显示组;员工ID也被删除)?

SELECT
    sum(SaleA+SaleB) as TotalSales,
    sum(SaleA+SaleB-CommA-CommB) as TSalesAftComm,
    count(Emp_ID) as NumOfSales,
    SaleDate
FROM
    Sales (nolock)
WHERE
    SaleDate>='2014-03-15 00:00:00'
GROUP BY 
    TotalSales
HAVING
    sum(SaleA+SaleB) > 10000
ORDER BY
    SaleDate

答案 2 :(得分:1)

你说,“我希望按天Emp_ID对销售额求和,但只计算超过10000美元的销售额。以下是我目前所拥有的。”

我读到这一点,因为您只想包含超过10k的销售额。换句话说,你想要总和销售额> 10k并忽略< = 10。如果是这种情况,那么您需要删除

HAVING sum(SaleA+SaleB) > 10000

而是添加到where子句

WHERE SaleDate>='2014-03-15 00:00:00'
  AND SaleA+SaleB > 10000

如果您的意思是其他内容,请编辑问题以澄清,我会再看看。