SQL Sumif 函数/GROUP BY & SUM?

Posted

技术标签:

【中文标题】SQL Sumif 函数/GROUP BY & SUM?【英文标题】:SQL Sumif functions / GROUP BY & SUM? 【发布时间】:2016-03-18 12:31:14 【问题描述】:

我已经坚持了一段时间了,我一生都无法理解为什么 SQL 没有完成我想要的。这看起来很简单,我知道这很简单,但我无法得到正确的数字。

我有一些代码可以从我们数据库的连接表中提取数据,显示客户编号、购买的产品、购买日期以及该产品线的产品价格和数量。当我在日期和按日期分组之间设置时,它可以完美运行并提取所有正确的信息。

我想要的是按产品分组,将每个客户在某个日期范围内购买的产品数量相加。当我尝试求和(SIL.ILQTY)时,总和超过calcualtes这个值......我已经尝试过Sum with CASE,它也失败了。我有下面的代码并过滤了记录以简化测试,因此只显示一种产品和一个客户,该产品有 7 个购买日期。

以下代码按日期显示有效的记录:

SELECT SIH.SICUST, SIL.ILPROD, date(SIL.ILDATE), SIL.ILNET, SIL.ILQTY,
       SIL.ILQTY*SIL.ILNET, SIH.SICUST || ' ' ||  rtrim(SIL.ILPROD) || ' '
FROM NWBAKERS.BPCSF.IIM IIM,
     NWBAKERS.BPCSF.SIH SIH,
     NWBAKERS.BPCSF.SIL SIL
WHERE SIH.SIINVN = SIL.ILINVN
  AND IIM.IPROD = SIL.ILPROD
  AND ((date(SIL.ILDATE) between '02/01/2016' and '02/29/2016'))
  and SIL.ILWHS ='PR'
  and SIL.ILQTY > '0'
  and SIH.SICUST = '40634'
  and SIL.ILPROD = '81039'
GROUP BY SIH.SICUST, SIL.ILPROD, date(SIL.ILDATE), SIL.ILQTY, SIL.ILNET

问题是当我从 group by 语句中删除日期(SIL.ILDATE)并在 select 语句中求和(SIL.ILQTY)以获得购买独特产品总数的唯一客户编号(ILQTY ) 在指定的日期范围内。

谁能指点我正确的方向????

上面的示例数据图像:

在 select 语句中从 Group by 和 sum(ILQTY) 中删除了 Date 的数据:

Desired result for one product by customer

Image shows the added fields for invoice number and order number, giving duplicate lines for date/quantity/invoice as order number are different. The sum of these qty values is what my SQL code was summing previously.

【问题讨论】:

我删除了 sql-server 标签,因为语法显然不是 SQL Server。 将大部分(日期/修剪/等)移动到派生表中,在主级别执行分组。 显示数据示例、所需输出和您得到的错误输出。 只是为了确保...如果您从 group by 语句中删除 date(SIL.ILDATE) 您还必须将其从 SELECT 列表中删除。如果您在 select 语句中求和(SIL.ILQTY),则还必须将其从 GROUP BY 中删除 感谢您的回复,我已经看到一个发票编号下可以有多个订单,这会在同一日期为 QTY 生成重复值。这就是为什么我的 sum 函数失败(按照我想要的方式)并且多算了 Products 的数量.......我需要以不同的方式加入吗?我添加了我首先得到的数据,我想要什么,以及在删除组中的日期并使用 sum(ILQTY) 后不正确的地方 【参考方案1】:

我找到了一种让它工作的方法,与我想象的有点不同,但它运作良好并返回完美的信息......感谢所有试图帮助解决这个问题的人!

SELECT T.SICUST, T.ILPROD, SUM(Quantity) as Num_Products 
FROM
(
SELECT SIH.SICUST, SIL.ILPROD, SIL.ILNET, MAX(SIL.ILQTY) as Quantity
FROM NWBAKERS.BPCSF.IIM IIM,
     NWBAKERS.BPCSF.SIH SIH,
     NWBAKERS.BPCSF.SIL SIL
WHERE SIH.SIINVN = SIL.ILINVN
AND IIM.IPROD = SIL.ILPROD
AND ((date(SIL.ILDATE) between '02/01/2016' and '02/29/2016'))
and SIL.ILWHS ='PR'
and SIL.ILQTY > '0'
and SIH.SICUST = '40634'
and SIL.ILPROD = '81039'
GROUP BY SIH.SICUST, SIL.ILPROD, SIL.ILNET, SIL.ILINVN
) AS T
GROUP BY T.SICUST, T.ILPROD

问题是我们的表格中的重复行来自同一发票 ID 上的多个订单,我从中获取最大值,然后在删除 group by 语句中的日期后对这些值求和。希望其他人会发现这很有用!

【讨论】:

【参考方案2】:

如果您想通过单个数量/价格了解您的客户多少次,并且想要总价值,您可以尝试这样的方法

 SELECT SIH.SICUST, SIL.ILPROD, date(SIL.ILDATE), SIL.ILNET, SIL.ILQTY,
    sum(SIL.ILQTY)*sum(SIL.ILNET) as TotalValue, count(*) as HowManyTimes,
    SIH.SICUST || ' ' ||  rtrim(SIL.ILPROD) || ' '
    FROM NWBAKERS.BPCSF.IIM IIM,
         NWBAKERS.BPCSF.SIH SIH,
         NWBAKERS.BPCSF.SIL SIL
    WHERE SIH.SIINVN = SIL.ILINVN
    AND IIM.IPROD = SIL.ILPROD
    AND ((date(SIL.ILDATE) between '02/01/2016' and '02/29/2016'))
    and SIL.ILWHS ='PR'
    and SIL.ILQTY > '0'
    and SIH.SICUST = '40634'
    and SIL.ILPROD = '81039'
    GROUP BY SIH.SICUST, SIL.ILPROD, SIL.ILDATE, SIL.ILQTY, SIL.ILNET

我没试过抱歉..

【讨论】:

谢谢,我可以试试!

以上是关于SQL Sumif 函数/GROUP BY & SUM?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中只要用到聚合函数就一定要用到group by 吗?

sql中group by 是啥意思啊?请教谢谢

sql group by用法

SQL --------------- GROUP BY 函数

sql中得group by 用法?

mysql group by 问题