2017-04-21 70 views
1

我遇到了,我知道我是接近於解決的問題,但我不能得到正確的數據又回來,或者是在查詢得到錯誤。SQL子查詢或組BY返回某個列的不同值?

基本上我想要做的是從單個表中選擇基於以下值的值:我希望他們基於我提供的員工姓名,我希望他們返回該員工的DISTINCT帳號(有時是相同的帳戶號碼列出不止一次...我只希望每個重複帳號的一行數據)。

這裏是我到目前爲止已經試過:

SELECT DISTINCT * FROM Employees WHERE EmpName = 'Mary Johnson' GROUP BY AccountID 

- 這會返回一個錯誤,說我沒有爲列僱員合計(不計算列,那麼,爲什麼它要求一個聚合?)

然後我試圖子查詢:

SELECT EmployeeID, EmpName, Department, Position, (SELECT DISTINCT AccountID From Employees) AS AcctID FROM Employees WHERE EmpName = 'Mary Johnson' 

- 這給了我一個錯誤說最多隻有一個記錄可以返回(我在訪問)。

我知道必須有一個解決方案,我正在尋找---目前如果我做了一個完整的查詢只是EmpName它返回30條記錄,但是,其中23個有重複的AccountID,所以應該只有是7個記錄,返回一個DISTINCT AccountID。

如何通過SQL實現這一目標?

下面是一個例子:

ID(PK)  EmpName   AcctID  Department Position EmpId 
------  --------  --------- --------  -------- ------ 
1   Mary Johnson  1234   IT   Tech  226663 
2   Mary Johnson  1234   IT   Tech  226663 
3   Mary Johnson  1234   IT   Tech  226663 
4   Mary Johnson  2345   IT   Tech  226663 
5   John James  23442   Banking  Teller  445645 
6   Jame Tabor  1234   HR   Manager 234555 

在上面的例子中我想要做一個SQL查詢與ACCOUNTID的瑪麗·約翰遜說是不同的,以獲得行了。所以,我們還是會回到2行瑪麗·約翰遜1234和瑪麗·約翰遜2345,忽視了其他2行瑪麗·約翰遜擁有的1234重複AccountIDs,並沒有叫瑪麗·約翰遜

+0

添加一些示例表格數據和預期結果 - 以及格式化文本。 – jarlh

+1

編輯您的問題並顯示「員工」中的列。 –

回答

1

這並不是很容易做到員工與其他行在MS Access中 - 它缺少row_number()。一種方法是使用另一種柱唯一標識具有相同AccountID每一行:

select e.* 
from Employees as e 
where e.?? = (select max(e2.??) 
       from Employees as e2 
       where e2.AccountId = e.AccountId and e2.empName = e.empName 
      ); 

??是唯一標識的行的列。

如果你只關心兩列,然後使用select distinct

select distinct e.empName, e.AccountId 
from employees as e; 

您的加入where條款要麼查詢來限制爲單個員工。但是,它沒有任何意義,我認爲一個名爲Employees表,對於一個員工的名字多行(除了在人的極少數情況下使用相同的名稱)。

+0

它只是一個通用的例子,我不能給你我的工作信息作爲它的限制。我也有一個ID作爲表中的主鍵 – MattE

+0

非常好,它的工作原理!謝謝你的幫助! – MattE

+0

呃...在SQL中工作小提琴完全沒問題,當我在Access中測試它結束了凍結Access ... – MattE

-1

你得到有關該錯誤的原因:「你只能返回一行」是因爲你使用子查詢送入記錄行。在這種情況下,您正在爲Mary Johnson搜索不同的AcctID,她有兩個不同的部分,因此查詢失敗。如果您使用MIN(AcctID)該查詢將正常工作。因此,這將工作:

SELECT EmployeeID, EmpName, Department, Position, MIN(AccountID) 
FROM Employees 
WHERE EmpName = 'Mary Johnson' 
GROUP BY EmployeeID, EmpName, Department, Position 

下一個問題,你需要問自己是哪個AccountID你想看?你可以切換到MAX,但是如果你有三個值,而你想要中間的那個,這將是一個更難解決的問題。但是,上面的查詢至少會給你一個工作結果。

編輯:

這應該給你只有一排假設你有瑪麗·約翰遜相同的信息。如果您獲得24,這意味着您有不同的條目對於empname,department,position或employeeid。如果您想查看與Mary Johnson關聯的所有AccountID,請使用:

SELECT EmployeeID, MIN(EmpName), AccountID, MIN(Department) AS Department, MIN(Position) AS Position 
FROM Employees 
WHERE EmpName = 'Mary Johnson' 
GROUP BY EmployeeID, AccountID 
+0

這不會給我正確的結果...它返回24記錄而不是7 – MattE

+0

請參閱我的編輯。此外,您的表格未設置爲遵循良好的關係數據庫結構規則。這是你問題的根源在這裏。 – SandPiper

+0

另外,如果你沒有得到你期望的結果,你應該在評論和原始文章中澄清,而不只是低估它。這實際上很粗魯和不敬。 – SandPiper