SQL - 我如何计算一年中每个月某些服务(具有不同定价)的交易总和?
SQL - How can I do sum of transactions for certain services (that have different pricing) for each month of the year?
所以我有这个:
SELECT
MONTH(trans_date) AS Month_Booking,
count(transact_no) AS NumTransactions,
(price * count(transact_no)) AS TotalRevenue
FROM transaction t
JOIN service s ON t.service_no = s.service_no
WHERE YEAR(trans_date) = 2017
GROUP BY MONTH(trans_date)
ORDER BY MONTH(trans_date) asc;
它返回了这个结果,这是错误的,因为它没有根据交易改变每项服务的价格,所以这里的总收入是错误的。
Result of Query Above
然后我尝试了这个,这部分完成了,因为它给了我一个月的收入——这是正确的,但是因为它根据每笔交易添加了不同的服务。
SELECT
sum(TotalRevenue) AS March_Revenue
FROM
(
SELECT
s.service_no,
description,
count(transact_no) AS NumTransactions,
(price * count(transact_no)) AS TotalRevenue,
trans_date
FROM service s
JOIN transaction t ON t.service_no = s.service_no
WHERE MONTH(trans_date) = 3
AND YEAR(trans_date) = 2017
GROUP BY service_no
ORDER BY service_no asc) March;
Result of Query Above
我想要的是有一个查询可以以某种方式获得每个月的总收入,而不必像这样单独执行。
有什么特别的方法吗?
提前致谢。
可能遗漏了一些东西,但我认为它只是
SELECT MONTH(trans_date) AS Month_Booking,
count(transact_no) AS NumTransactions,
sum(price) AS TotalRevenue
FROM transaction t
JOIN service s
ON t.service_no = s.service_no
WHERE YEAR(trans_date) = 2017
GROUP BY MONTH(trans_date)
ORDER BY MONTH(trans_date) asc;
除非您在某处有历史价格,否则这是不可能的。如果在 TRANSACTION table 中有价格 TRANSACTION_PRICE 就很容易了:
SUM(transaction_price)
如果没有你就迷路了。数据不再存在于数据库中,除非你有一些秘密审计 tables,你可以从中计算出历史价格。
这行不通吗?假设 service_no 和价格是 1:1
SELECT Month_Booking,
SUM(cnt_service_no * price) AS Total_Revenue
FROM (SELECT MONTH(trans_date) AS Month_Booking,
COUNT(s.service_no) AS cnt_service,
s.price
FROM transaction t
INNER
JOIN service s
ON t.service_no = s.service_no
GROUP
BY MONTH(trans_date),
s.service_no,
s.price
)
GROUP
BY Month_Booking;
所以我有这个:
SELECT
MONTH(trans_date) AS Month_Booking,
count(transact_no) AS NumTransactions,
(price * count(transact_no)) AS TotalRevenue
FROM transaction t
JOIN service s ON t.service_no = s.service_no
WHERE YEAR(trans_date) = 2017
GROUP BY MONTH(trans_date)
ORDER BY MONTH(trans_date) asc;
它返回了这个结果,这是错误的,因为它没有根据交易改变每项服务的价格,所以这里的总收入是错误的。 Result of Query Above
然后我尝试了这个,这部分完成了,因为它给了我一个月的收入——这是正确的,但是因为它根据每笔交易添加了不同的服务。
SELECT
sum(TotalRevenue) AS March_Revenue
FROM
(
SELECT
s.service_no,
description,
count(transact_no) AS NumTransactions,
(price * count(transact_no)) AS TotalRevenue,
trans_date
FROM service s
JOIN transaction t ON t.service_no = s.service_no
WHERE MONTH(trans_date) = 3
AND YEAR(trans_date) = 2017
GROUP BY service_no
ORDER BY service_no asc) March;
Result of Query Above
我想要的是有一个查询可以以某种方式获得每个月的总收入,而不必像这样单独执行。
有什么特别的方法吗?
提前致谢。
可能遗漏了一些东西,但我认为它只是
SELECT MONTH(trans_date) AS Month_Booking,
count(transact_no) AS NumTransactions,
sum(price) AS TotalRevenue
FROM transaction t
JOIN service s
ON t.service_no = s.service_no
WHERE YEAR(trans_date) = 2017
GROUP BY MONTH(trans_date)
ORDER BY MONTH(trans_date) asc;
除非您在某处有历史价格,否则这是不可能的。如果在 TRANSACTION table 中有价格 TRANSACTION_PRICE 就很容易了:
SUM(transaction_price)
如果没有你就迷路了。数据不再存在于数据库中,除非你有一些秘密审计 tables,你可以从中计算出历史价格。
这行不通吗?假设 service_no 和价格是 1:1
SELECT Month_Booking,
SUM(cnt_service_no * price) AS Total_Revenue
FROM (SELECT MONTH(trans_date) AS Month_Booking,
COUNT(s.service_no) AS cnt_service,
s.price
FROM transaction t
INNER
JOIN service s
ON t.service_no = s.service_no
GROUP
BY MONTH(trans_date),
s.service_no,
s.price
)
GROUP
BY Month_Booking;