[英]SELECT a column and SUM() of values from another table in SQL
我對SQL很陌生,這給我帶來了麻煩。 這個想法是我有幾個表。 以下是相關的表和列:
customers:
customer_id, customer_name
orders:
order_id, customer_id
orderline:
order_id, item_id, order_qty
items:
item_id, unit_price
我需要返回customer_name以及該客戶的總收入(按item_price * order_qty * 2計算)。
這是我寫的:
SELECT customers.customer_name, sum(revenue)
FROM SELECT orderline.order_qty * items.unit_value * 2 AS revenue
FROM orderline
INNER JOIN orders
ON orderline.order_id = orders.order_id
INNER JOIN customers
ON revenue.customer_id = customers.customer_id;
這將引發語法錯誤,我不確定如何繼續。
這只是我需要解決的這類問題的一個示例,因此更籠統的答案會有所幫助。
提前致謝!
編輯:
在答案的幫助下,我最終得到了這段代碼,該代碼僅獲得總收入,並將其置於數據庫名稱的第一位。 我在這里錯了什么?
SELECT customers.customer_name, sum(revenue)
FROM(SELECT orderline.order_qty * items.unit_price * 2 AS revenue, orders.customer_id AS CustomerID
FROM( orderline
INNER JOIN orders
ON orderline.order_id = orders.order_id
INNER JOIN items
ON orderline.item_id = items.item_id)) CustomerOrders
INNER JOIN customers
ON CustomerOrders.CustomerID = customers.customer_id;
SELECT c.customer_name,
sum(COALESCE(ol.order_qty,0) * COALESCE(i.unit_value,0) * 2)
FROM customers c
INNER JOIN orders o
ON o.customer_id = c.customer_id;
INNER JOIN orderline ol
ON ol.order_id = o.order_id
INNER JOIN items i
ON i.item_id = ol.item_id
GROUP BY c.customer_id
您的查詢有幾個問題。 首先,您需要確定子查詢的范圍並為其命名別名:
(SELECT orderline.order_qty * items.unit_value * 2 AS revenue
FROM orderline
INNER JOIN orders
ON orderline.order_id = orders.order_id) CustomerOrders
其次,您需要選擇比子查詢中更多的收入,因為您正在將其加入到customers表中
(SELECT
orderline.order_qty * items.unit_value * 2 AS revenue,
orders.customer_id AS CustomerId
FROM
orderline
INNER JOIN orders ON orderline.order_id = orders.order_id) CustomerOrders
然后,您需要使用joins到customers表中的子查詢別名,並將其全部按customer_id和CustomerOrders.Group收入一個組中。
我傾向於做不同的事情。 我將從客戶表中進行選擇,因為這是您要尋找的基礎。 然后,我將對所有交叉匯總子查詢中的訂單收入的訂單進行交叉應用。 它看起來像這樣(tsql,您可以在mysql中通過一些聚合進行相同的操作):
SELECT
customers.customer_name,
ISNULL(customerOrders.Revenue, 0) AS Revenue
FROM
customers
OUTER APPLY (
SELECT
SUM (orderline.order_qty * items.unit_value * 2) AS Revenue
FROM
orders
INNER JOIN
orderline ON orders.order_id = orderline.order_id
INNER JOIN
items on orderline.item_id = items.item_id
WHERE
orders.customer_id = customers.customer_id
) CustomerOrders
在這種情況下,子查詢將為您匯總所有訂單,並且每個客戶僅返回一行,因此不會有多余的返回數據。 由於是外部應用,因此對於沒有訂單的客戶,它也將返回null。 您可以將其更改為CROSS APPLY,它將過濾掉沒有訂單的客戶(例如INNER JOIN)。
select customer_name, sum(item_price * order_qty * 2) as total_revenue
from (
select * from customers
inner join orders using(customer_id)
inner join orderline using(order_id)
inner join items using(item_id)
)
group by customer_name
select
c.customer_name,
r.revenue
from
customers c
inner join
orders ord on
ord.customer_id = c.customer_id
inner join
(select i.item_id, o.order_id, sum(o.order_qty * items.unit_value * 2) as revenue
from orderline o
inner join items i on
i.item_id = o.item_id
group by o.order_id, i.item_id) as r on r.order_id = o.order_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.