如何在多个 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;
我有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;