如何在多个 select 语句中使用 SUM 和 MAX table

How to use SUM and MAX in select statement more than one table

我有2张桌子

table a mempur      
    
    memberno = member number    
    purdt    = purchase date    
    amount   = purchase amount

table b meminfo

    memberno = member number
    fname    = first name
    age      = age


select a.memberno,b.fname,sum(a.amount),a.purdt,b.age from mempur a,(select max(purdt) as maxdate,memberno from mempur group by memberno) maxresult,meminfo b
where a.memberno=b.memberno
and a.purdt between '01-JAN-22' and '28-FEB-22'
and a.memberno=maxresult.memberno
and a.purdt=maxresult.maxdate
group by a.memberno,b.fname,a.purdt,b.age
order by a.memberno;

如何从 table mempur 获得总购买金额和最高购买日期的结果? 我使用此查询能够显示结果,但范围内的总量不正确。

非常感谢任何人的帮助。

我的示例数据

MEMBERNO        PURDT              AMOUNT
--------------- --------------- ---------
BBMY0004580     12-AUG-21          823.65
BBMY0004580     12-AUG-21          1709.1
BBMY0004580     26-AUG-21          1015.1
BBMY0004580     28-AUG-21          1105.1

我的结果只显示总金额1105.1

您可以在 mempur 聚合然后加入 meminfo:

SELECT i.*, p.total_amount, p.maxdate
FROM meminfo i 
INNER JOIN (
  SELECT memberno, SUM(amount) total_amount, MAX(purdt) maxdate
  FROM mempur 
  WHERE purdt BETWEEN '01-JAN-22' AND '28-FEB-22'
  GROUP BY memberno
) p ON p.memberno = i.memberno;

如果结果中有成员没有您想要的购买,您可以使用 LEFT 加入。

您的查询获得了最大购买量并合计了该日期的金额。它还会检查最大 purdt 是在 2022 年 1 月还是 2 月。如果是,则显示结果,如果不是,则不显示结果。这不是您想要的查询。

除此之外,查询看起来很丑陋。您正在使用难以阅读且容易出错的古老连接语法。我们在 1980 年代使用它,但在 1992 年,显式连接将其纳入 SQL 标准。您不应再使用这种旧的逗号语法。看到它仍在使用很奇怪。感觉就像去博物馆一样。然后,您正在使用 table 别名。这些想法是为了让查询更具可读性,但你的查询甚至会降低可读性,因为你的别名 a 和 b 是任意的。请改用助记名称,例如mp 代表 mempur,mi 代表 meminfo。然后,您将日期(我希望 purdt 一个日期!)与字符串进行比较。不。请改用日期文字。

至于你的table:你真的在存储年龄吗?您必须每天更新它才能保留它 up-to-date。最好存储出生日期并在查询中根据它计算年龄。

这是一个查询,可让您获得最大日期和给定日期范围内的总金额:

select memberno, m.name, p.sum_amount, p.max_purdt, m.age
from meminfo m
left outer join
(
  select memberno, sum(amount) as sum_amount, max(purdt) as max_purdt
  from mempur
  where purdt >= date '2022-01-01' and purdt < date '2022-03-01'
  group by memberno
) p using (memberno)
order by memberno;

这里是一个查询,可以为您提供最大总日期以及给定日期范围内的总金额:

select memberno, m.name, p.sum_amount, p.max_purdt, m.age
from meminfo m
left outer join
(
  select
    memberno,
    sum(case when where purdt >= date '2022-01-01' and purdt < date '2022-03-01'
          then amount
        end) as sum_amount,
    max(purdt) as max_purdt
  from mempur
  group by memberno
) p using (memberno)
order by memberno;