簡體   English   中英

從SQL中的另一個表中選擇一個列和值的SUM()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM