【问题标题】:SUM as condition when joining tablesSUM 作为连接表时的条件
【发布时间】:2017-05-15 14:36:40
【问题描述】:

我有这个查询,它计算我每月的退货发票数量:

SELECT MONTH(ORIN.DocDate) mes, COUNT(*) tot
FROM ORIN
WHERE DATEDIFF(MONTH, ORIN.DocDate, GETDATE()) <= 12
GROUP BY MONTH(ORIN.DocDate)

现在我只需要获取项目数量超过 100 的发票。为此,我必须加入另一个表(发票项目):

INNER JOIN RIN1 ON ORIN.DocEntry = RIN1.DocEntry

我会把这个放在某个地方(必须是 SUM,因为一张发票可以有很多项目):

WHERE SUM(RIN1.Quantity) > 100

问题是我不知道如何进行此查询。我的最后一次尝试如下,但它没有带来正确的价值观:

SELECT MONTH(ORIN.DocDate) mes, COUNT(*) tot
FROM ORIN
INNER JOIN RIN1 ON ORIN.DocEntry = RIN1.DocEntry
WHERE DATEDIFF(MONTH, ORIN.DocDate, GETDATE()) <= 12
GROUP BY MONTH(ORIN.DocDate)
HAVING SUM(RIN1.Quantity) > 100

【问题讨论】:

  • 您使用的是哪种数据库/风格或 SQL?
  • 我认为您不需要在查询中使用HAVING 子句,因为Quantity 本身解释了数字,可以将AND RIN1.Quantity&gt;100 添加到您的Where 子句中
  • 问题是一张发票可以有多个项目,而 RIN1 是每条记录一个项目。
  • SQL Server 2008 R2

标签: sql sql-server sql-server-2008 sum


【解决方案1】:

您只想考虑包含超过 100 个项目的发票。两种方法:

1) 计算具有相关子查询的项目:

select month(docdate) mes, count(*) tot
from orin
where datediff(month, docdate, getdate()) <= 12
and 
(
  select sum(quantity)
  from rin1
  where rin1.docentry = orin.docentry
) > 100
group by month(docdate);

2) 查找超过 100 项的发票列表:

select month(docdate) mes, count(*) tot
from orin
where datediff(month, docdate, getdate()) <= 12
and docentry in
(
  select docentry
  from rin1
  group by docentry
  having sum(quantity) > 100
)
group by month(docdate);

【讨论】:

    【解决方案2】:

    您要过滤包含超过 100 项的发票,以 RIN1.Quantity 表示。

    只需在WHERE中添加过滤器:

    SELECT MONTH(ORIN.DocDate) mes, COUNT(*) tot
    FROM ORIN
    INNER JOIN RIN1 ON ORIN.DocEntry = RIN1.DocEntry
    WHERE DATEDIFF(MONTH, ORIN.DocDate, GETDATE()) <= 12
      AND RIN1.Quantity > 100
    GROUP BY MONTH(ORIN.DocDate)
    

    【讨论】:

    • 问题是一张发票可以有多个项目,而 RIN1 是每条记录一个项目
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2015-12-17
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多