簡體   English   中英

如何處理帶有總和的 SQL 子查詢

[英]How to handle SQL subqueries with sums

我正在 MySQL 中的示例數據庫上練習查詢。

我有一個主鍵為emp_id員工表。

我有一個帶有emp_idclient_id復合鍵的works_with表。 它還有一列total_sales

我正在嘗試編寫一個查詢,該查詢返回總銷量超過 100,000 的任何員工的姓名。

我能夠返回員工 ID 和總計超過 100,000 的總金額,如下所示:

SELECT SUM(total_sales) AS total_sales, emp_id
FROM works_with 
WHERE total_sales > 100000
GROUP BY emp_id;

但我不確定如何使用它來獲取員工姓名。 我試過嵌套查詢,但沒有運氣。 例如,當我嘗試這樣做時:

SELECT first_name, last_name 
FROM employee
WHERE emp_id IN (
    SELECT SUM(total_sales) AS total_sales, emp_id
    FROM works_with WHERE total_sales > 100000
    GROUP BY emp_id
)

我收到錯誤 1241:操作數應包含 1 列。 我相信這是因為我在嵌套查詢中選擇了兩列? 那么我將如何處理這個問題?

只需join

select sum(w.total_sales) as total_sales, e.first_name, e.lastnmae
from works_with w
inner join employee e on e.emp_id = w.emp_id
group by e.emp_id
having sum(w.total_sales) > 10000;

請注意,我使用了having子句而不是where子句:大概,您想對每個員工的所有銷售額求和,然后過濾該結果。 您的原始查詢僅對大於 100000 的單個值求和。

添加到 GMB 的解決方案。

使用現有的 Select 並將其包裝在派生表/CTE 中:

SELECT e.first_name, e.last_name, big_sales.total_sales
FROM employee as e
join 
 (
   SELECT SUM(total_sales) AS total_sales, emp_id
   FROM works_with
   GROUP BY emp_id
   HAVING total_sales > 100000
 ) as big_sales
on e.emp_id = big_sales.emp_id

現在您可以顯示 total_sales 和員工詳細信息。 此外,這應該更有效,因為您在加入之前聚合和過濾。

如果您只需要顯示員工,您可以使用子查詢(就像您嘗試過的那樣),但它必須返回一列,即從選擇列表中刪除 SUM:

SELECT first_name, last_name 
FROM employee
WHERE emp_id IN (
    SELECT emp_id -- , SUM(total_sales) AS total_sales
    FROM works_with 
    GROUP BY emp_id
    HAVING SUM(total_sales) > 100000
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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