获取分组结果的最后一个值 - Oracle SQL
Getting last value of a grouped result - Oracle SQL
有一个账单列表我想知道每个客户分组的销量。
每张账单都有一个负责人(一个店员,要么在table顾客中),所以我想接上一张账单的人,并在结果中。
结果应该是这样的:
客户 - 账单总额 - 最后一张账单的负责人。
由于 Oracle 没有 "Limit" 选项(我们还没有 12c),我必须使用 Subselect 来完成。这意味着我无法比较客户的 ID,因为它超出了范围(请参阅下面的代码)。
欢迎任何建议。
SELECT customer.NAME, SUM(bills.SUME),
(SELECT responsibleP FROM
(SELECT responsibleP FROM bills b WHERE b.responsibleP = customer.id
order by asc billDate)
WHERE ROWNUM = 1)
FROM customer, bills
WHERE customer.id = bills.customerid
GROUP BY customer.id;
在这种情况下 b.responsible 无法从客户那里获得 customer.id table.
请随意更改标题,我不太擅长这个,抱歉!
您应该能够使用 MAX( column ) KEEP ( DENSE_RANK [FIRST|LAST] ORDER BY other_columns [ASC|DESC] )
获取一列的最大值,该列还具有另一列的 FIRST
或 LAST
值。像这样:
SELECT c.NAME,
SUM(b.SUME),
MAX( b.respondibleP ) KEEP ( DENSE_RANK LAST ORDER BY b.billDate )
AS lastResponsible
FROM customer c
INNER JOIN bills b
ON ( c.id = b.customerid )
GROUP BY c.id;
在 Oracle 中使用 KEEP LAST
:
SELECT
c.name,
SUM(bills.sume),
MAX(b.responsibleP) KEEP (DENSE_RANK LAST ORDER BY b.billDate)
FROM customer c
JOIN bills b ON c.id = b.customerid
GROUP BY c.id;
有一个账单列表我想知道每个客户分组的销量。 每张账单都有一个负责人(一个店员,要么在table顾客中),所以我想接上一张账单的人,并在结果中。
结果应该是这样的: 客户 - 账单总额 - 最后一张账单的负责人。
由于 Oracle 没有 "Limit" 选项(我们还没有 12c),我必须使用 Subselect 来完成。这意味着我无法比较客户的 ID,因为它超出了范围(请参阅下面的代码)。 欢迎任何建议。
SELECT customer.NAME, SUM(bills.SUME),
(SELECT responsibleP FROM
(SELECT responsibleP FROM bills b WHERE b.responsibleP = customer.id
order by asc billDate)
WHERE ROWNUM = 1)
FROM customer, bills
WHERE customer.id = bills.customerid
GROUP BY customer.id;
在这种情况下 b.responsible 无法从客户那里获得 customer.id table.
请随意更改标题,我不太擅长这个,抱歉!
您应该能够使用 MAX( column ) KEEP ( DENSE_RANK [FIRST|LAST] ORDER BY other_columns [ASC|DESC] )
获取一列的最大值,该列还具有另一列的 FIRST
或 LAST
值。像这样:
SELECT c.NAME,
SUM(b.SUME),
MAX( b.respondibleP ) KEEP ( DENSE_RANK LAST ORDER BY b.billDate )
AS lastResponsible
FROM customer c
INNER JOIN bills b
ON ( c.id = b.customerid )
GROUP BY c.id;
在 Oracle 中使用 KEEP LAST
:
SELECT
c.name,
SUM(bills.sume),
MAX(b.responsibleP) KEEP (DENSE_RANK LAST ORDER BY b.billDate)
FROM customer c
JOIN bills b ON c.id = b.customerid
GROUP BY c.id;