【问题标题】:SQL : wrong total returnedSQL:返回的总数错误
【发布时间】:2019-12-21 15:47:58
【问题描述】:

我正在处理一个 SQL 项目,其中我有一个存储过程,用于返回每个客户在特定时间段内的总发票。我编写了一个存储过程,它返回每个客户的总金额,但总结果略高于实际金额。

  • 客户 1 总计:23(单独查询找到他)
  • 客户 1:总共 25 个(使用存储过程)

这是我的存储过程,我有下表。感谢您的宝贵时间。

CREATE PROCEDURE QUERY4 
    @p_StartDate DATE, @p_EndDate DATE
AS
BEGIN
    SELECT ct.*, SUM(iv.Total) AS Total
    FROM Customer AS ct, Invoice AS iv
    WHERE ct.CustomerId = iv.CustomerId 
      AND iv.InvoiceDate BETWEEN @p_StartDate AND @p_EndDate
    GROUP BY ct.CustomerId, ct.FirstName, ct.LastName, ct.Company, ct.Country, ct.State, ct.City, 
            ct.Address, ct.PostalCode, ct.Phone, ct.Fax, ct.Email, ct.SupportRepId
    ORDER BY Total DESC
 END;

【问题讨论】:

  • 如果您想要每个客户的总发票,那么您只需按 customerid 而不是其他列分组,因为客户可能具有相同的姓名,或者在某些发票中可能没有正确输入详细信息
  • 发布用于查找单个客户总数的查询。
  • 考虑到我已将它们包含在选择中,我无法删除其余部分。
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它

标签: sql sum invoice


【解决方案1】:

您可以先将发票分组到子查询中。
然后INNER JOIN 给客户。

    SELECT ct.*, inv.Total
    FROM 
    (
       SELECT i.CustomerId, SUM(i.Total) AS Total
       FROM Invoice i
       WHERE i.InvoiceDate >= @p_StartDate
         AND i.InvoiceDate <= @p_EndDate
       GROUP BY i.CustomerId
    ) inv
    INNER JOIN Customer AS ct
      ON ct.CustomerId = inv.CustomerId 
    ORDER BY inv.Total DESC

但这应该会得到与之前相同的结果。
因此,也许您可​​以分享您使用的找到 23 的查询。
另外,InvoiceDate 是 DATE 类型还是 DATETIME?

【讨论】:

  • 感谢您分享您的解决方案,我现在得到的结果与我手动添加总计时的结果相同。
  • @sotis 很高兴它解决了您的问题。但对我来说,您的原始查询似乎应该给出相同的结果。所以我怀疑 InvoiceDate 是一个日期时间字段。和 f.e. '2019-12-15 00:00:01' 不小于或等于日期 '2019-12-15'。但cast('2019-12-15 00:00:01' as date) &lt;= cast('2019-12-15' as date) 确实评估为真。
  • InvoiceDate 确实是一个日期时间字段,你是对的。
  • @sotis 如果是这样的话,也许你会发现this answer 是一个有趣的技巧。问题是像where cast(datetimecol1 as date) &lt;= @datevariable 这样的操作会起作用,但是由于 CAST,查询优化器可能会忽略 datetimecol1 上的索引。从而使查询变慢。好吧,这只是在它被编入索引的情况下。
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多