【问题标题】:SQL sum with Group By of subquery maxSQL sum with Group By of subquery max
【发布时间】:2021-03-26 21:12:29
【问题描述】:

我有一个库存总帐汇总表。每个项目都有多行(项目更改的上个月期间)。我可以通过内部连接轻松获得总和(数量*价格)的当前值(选择最大值(后日期)。所以估值是总和(数量)所以如果你想要 202103 后期的估值,你会采取每个零件号的最大值(后日期)并将其加起来。对于 202103,它将是 PartA = 10、PartB 62 和 PartC 12。如果我想在 202012 年后期得到它,那么它将是 partA 14、PartB 62 和PartC 12. 基本上使用 PartA 的最大日期 202012。所以我有查询为整个表做最大值(最新的)。但是我将如何处理它来获得每个时期的说法。我已经在子查询和其他所有内容中尝试了各种 group by,但似乎无法完成这项工作。

part#  qty post_date
PartA  23  202004
PartB  55  202004
PartC  12  202004
PartA  20  202006
PartB  62  202007
PartA  14  202012
PartA  12  202102
PartA  10  202103

select
    sum(qty)
from
    invtable inv
INNER JOIN (
    Select
        max(post_date)
    from
        invtable inv2
    WHERE
        post_date < 202103
    GROUP BY
        partnumber
) as t2 
    ON t2.partnuumber = inv.partnumber
    and t2.post_date = inv.post_date

理想情况下,我想要以下内容

202004 90
202006 87
202007 94
202012 88
202102 86
202103 84

任何帮助或建议将不胜感激。如果我不能让它以这种方式输出,我想我可以以编程方式运行每个周期并将其转储到一个表中,然后从那里拉出。

【问题讨论】:

  • 您的问题不清楚,请尝试改写并提供更好的示例数据和所需的输出并解释它,您的解释与示例数据无关
  • 如果结果取决于列,那么“为清楚起见”将成本列关闭肯定不会澄清任何事情。
  • 为什么 post_date 不是完整的日期值?
  • 您使用的是什么数据库?我不确定任何种类的 SQL 都可以单独完成这个任务。我很可能会采用程序化方法。
  • 我编辑只是说总和将完成同样的事情。使用 SQL92 的进度数据库。虽然 j 可以导出到 Postgres,但那时我可能会以编程方式导出到另一个表来完成相同的操作。虽然我更喜欢找一个合适的团体。发布日期不是完整日期。它本质上是 GL 发布日期的年份和月份。我绝对可以得到最新的估值。我只是无法获得每个发布日期的总和值。

标签: sql subquery


【解决方案1】:

我在mysql 中试过这个。下面是查询。请根据您的数据库看看是否可以更改或使用。

-- to find the sum of qty 
select
    finalT2.post_date, sum(finalT1.qty)
from
    invtable finalT1
    join 
    (
      -- for each post date -> find the max of post date for each part
      select
        t2.post_date, t1.part, max(t1.post_date) as max_post_date
      from
        invtable t1
        join 
        (  -- group to find the list of post_date(s)
           select
         post_date
           from
         invtable
           group by
         post_date
         ) t2 on t1.post_date <= t2.post_date
       group by
         t2.post_date, t1.part
    ) finalT2 on finalT1.post_date = finalT2.max_post_date and finalT1.part = finalT2.part
group by
    finalT2.post_date

输出图像 -

在 Fiddle 中查询输出以供参考: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=18657bfb3ec0f8d4826a8c940ecc9941

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 2021-03-04
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多