【问题标题】:GROUP BY not returning correct totalsGROUP BY 未返回正确的总数
【发布时间】:2014-05-08 08:38:56
【问题描述】:

我有这个查询,我一直在搞乱,似乎看不到要更改什么才能收到我想要的结果。

我想按天对销售额求和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

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

【问题讨论】:

  • 您是否有一些示例表格内容希望显示的结果可以添加到问题中?
  • 如果可能的话,我希望将结果作为我列出的最后一个表格结果来查看
  • 是的,但是您希望作为答案的表格内容是什么?你给出的是答案,而不是问题。

标签: sql tsql sql-server-2000


【解决方案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

【讨论】:

  • 不能在用于 GROUP BY 子句的 group by 列表的表达式中使用聚合或子查询。是我得到的错误
  • 对不起,我不是故意的。当您发表评论时,我正在编辑我的帖子。大声笑
  • Msg 207,第 16 级,状态 3,第 3 行列名“TotalSales”无效。消息 207,级别 16,状态 3,第 3 行无效的列名称“TotalSales”。消息 207,级别 16,状态 3,第 3 行无效的列名称“TotalSales”。消息 207,级别 16,状态 3,第 3 行无效的列名称“TotalSales”。消息 207,级别 16,状态 3,第 3 行无效的列名称“TotalSales”。现在是错误:(
  • GROUP BY SUM(SaleA+SaleB)。顺便说一句,您在这些列中是否有任何 NULL?因为如果你这样做了,你可能想要SUM(CASE WHEN SaleA IS NULL THEN 0 ELSE SaleA END + CASE WHEN SaleB IS NULL THEN 0 ELSE SaleB END)。 (很遗憾,SqlServer 2000 中没有COALESCE()。)
  • @TinyHaitian,好吧,看来你对 COALESCE() 的看法是对的,我已更正,但无法编辑旧评论。
【解决方案2】:

没有用于测试的 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

【讨论】:

  • 这个好像是所有销售额的总和,即使是当天低于 10k 的销售额。我非常有信心这个看起来很有希望
【解决方案3】:

您说,“我想按 Emp_ID 对每天的销售额求和,但只对超过 10000 美元的求和。以下是我目前拥有的。”

我读到了,因为您只想包括超过 10k 的销售额。换句话说,您希望将销售额相加 > 10k 并忽略

HAVING sum(SaleA+SaleB) > 10000

而是添加到 where 子句

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

如果你的意思是别的,请编辑问题以澄清,我会再看一下。

【讨论】:

  • 也许我问错了。我希望将当天的所有销售额相加,如果该总和 > 10000 则包含在我的查询中
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多