Select 按 id 分组的平均值的总平均值
Select total average of averages grouped by id
在我代表汽车服务站的数据库中,我试图找出一个 SQL 查询,它会给我一个客户为单次服务支付的总平均数,而不是得到所有现有发票价格的 AVG(),我想按相同 reservation_id 对发票进行分组。之后,我想得到所有这些分组结果的总平均值。
我正在使用下图中列出的两个表。我想通过将 AVG() 应用于通过相同 FK Reservation_reservation_id.
对价格进行分组而得出的所有平均值来获得总平均价格的值
我试图将它变成一个查询,但我失败了,所以我来寻求更有经验的用户的帮助。另外,我只需要 select (获取)总平均值的结果。这个结果应该让我大致了解每位客户平均为一次预订支付的费用。
感谢您的宝贵时间
您似乎想要聚合两次:
SELECT AVG( avg_price ) avg_avg_price
FROM (
SELECT AVG( price ) AS avg_price
FROM invoice
GROUP BY reservation_reservation_id
)
其中,对于示例数据:
CREATE TABLE invoice ( reservation_reservation_id, price ) AS
SELECT 1, 10 FROM DUAL UNION ALL
SELECT 1, 12 FROM DUAL UNION ALL
SELECT 1, 14 FROM DUAL UNION ALL
SELECT 1, 16 FROM DUAL UNION ALL
SELECT 2, 10 FROM DUAL UNION ALL
SELECT 2, 11 FROM DUAL UNION ALL
SELECT 2, 12 FROM DUAL;
输出:
AVG_AVG_PRICE
12
db<>fiddle here
您可能想尝试以下方法:
with aux (gr, subgr, val) as (
select 'a', 'a1', 1 from dual union all
select 'a', 'a2', 2 from dual union all
select 'a', 'a3', 3 from dual union all
select 'a', 'a4', 4 from dual union all
select 'b', 'b1', 5 from dual union all
select 'b', 'b2', 6 from dual union all
select 'b', 'b3', 7 from dual union all
select 'b', 'b4', 8 from dual)
SELECT
gr,
avg(val) average_gr,
avg(avg(val)) over () average_total
FROM
aux
group by gr;
将其应用于您的 table,将导致:
SELECT
reservation_id,
avg(price) average_rn,
avg(avg(price)) over () average_total
FROM
invoices
group by reservation_id;
如果您希望每个客户都这样做:
SELECT customer_customer_id, AVG(avg_reservation_price)
FROM (SELECT i.customer_customer_id, i.reservation_reservation_id,
AVG(i.price) as avg_reservation_price
FROM invoice i
GROUP BY i.customer_customer_id, i.reservation_reservation_id
) ir
GROUP BY customer_customer_id;
如果您出于特定的“结帐原因”而需要此服务——这是我想象的最接近“服务”的意思——那么加入预订 table 和过滤器:
SELECT customer_customer_id, AVG(avg_reservation_price)
FROM (SELECT i.customer_customer_id, i.reservation_reservation_id,
AVG(i.price) as avg_reservation_price
FROM invoice i JOIN
reservation r
ON i.reservation_reservation_id = r.reservation_id
WHERE r.checkup_type = ?
GROUP BY i.customer_customer_id, i.reservation_reservation_id
) ir
GROUP BY customer_customer_id;
在我代表汽车服务站的数据库中,我试图找出一个 SQL 查询,它会给我一个客户为单次服务支付的总平均数,而不是得到所有现有发票价格的 AVG(),我想按相同 reservation_id 对发票进行分组。之后,我想得到所有这些分组结果的总平均值。
我正在使用下图中列出的两个表。我想通过将 AVG() 应用于通过相同 FK Reservation_reservation_id.
对价格进行分组而得出的所有平均值来获得总平均价格的值我试图将它变成一个查询,但我失败了,所以我来寻求更有经验的用户的帮助。另外,我只需要 select (获取)总平均值的结果。这个结果应该让我大致了解每位客户平均为一次预订支付的费用。
感谢您的宝贵时间
您似乎想要聚合两次:
SELECT AVG( avg_price ) avg_avg_price
FROM (
SELECT AVG( price ) AS avg_price
FROM invoice
GROUP BY reservation_reservation_id
)
其中,对于示例数据:
CREATE TABLE invoice ( reservation_reservation_id, price ) AS
SELECT 1, 10 FROM DUAL UNION ALL
SELECT 1, 12 FROM DUAL UNION ALL
SELECT 1, 14 FROM DUAL UNION ALL
SELECT 1, 16 FROM DUAL UNION ALL
SELECT 2, 10 FROM DUAL UNION ALL
SELECT 2, 11 FROM DUAL UNION ALL
SELECT 2, 12 FROM DUAL;
输出:
AVG_AVG_PRICE 12
db<>fiddle here
您可能想尝试以下方法:
with aux (gr, subgr, val) as (
select 'a', 'a1', 1 from dual union all
select 'a', 'a2', 2 from dual union all
select 'a', 'a3', 3 from dual union all
select 'a', 'a4', 4 from dual union all
select 'b', 'b1', 5 from dual union all
select 'b', 'b2', 6 from dual union all
select 'b', 'b3', 7 from dual union all
select 'b', 'b4', 8 from dual)
SELECT
gr,
avg(val) average_gr,
avg(avg(val)) over () average_total
FROM
aux
group by gr;
将其应用于您的 table,将导致:
SELECT
reservation_id,
avg(price) average_rn,
avg(avg(price)) over () average_total
FROM
invoices
group by reservation_id;
如果您希望每个客户都这样做:
SELECT customer_customer_id, AVG(avg_reservation_price)
FROM (SELECT i.customer_customer_id, i.reservation_reservation_id,
AVG(i.price) as avg_reservation_price
FROM invoice i
GROUP BY i.customer_customer_id, i.reservation_reservation_id
) ir
GROUP BY customer_customer_id;
如果您出于特定的“结帐原因”而需要此服务——这是我想象的最接近“服务”的意思——那么加入预订 table 和过滤器:
SELECT customer_customer_id, AVG(avg_reservation_price)
FROM (SELECT i.customer_customer_id, i.reservation_reservation_id,
AVG(i.price) as avg_reservation_price
FROM invoice i JOIN
reservation r
ON i.reservation_reservation_id = r.reservation_id
WHERE r.checkup_type = ?
GROUP BY i.customer_customer_id, i.reservation_reservation_id
) ir
GROUP BY customer_customer_id;