2016-05-18 5 views
0

私はこれまで私が持っているものとソリューションオフだ実現:列の関係

Select FirstName || ' ' || LastName AS Manager From Employee 
Where (Select COUNT(ReportsTo) from Employee 
group by ReportsTo 
order by ReportsTo desc); 

ReportsTo値は、彼らが何をしたい

に報告EmployeeIDがで従業員の名前を照会することです彼らに報告するほとんどの従業員と彼らはヌルなしで順番に報告します。私はどのような説明が役立つようにReportsTo to EmployeeIDのような列の値の間の接続を作るかわからない

例として、フレッド・ジョーンズ|メアリー・アン| Mary Anne彼らの社員と同じ値と第1の従業員と同じ社員と従業員の名前である第2の最も報告先との最初のものの従業員は、このデータを持っていたら、あなたが行うことができます

+0

あなたはあなたの質問を言い換えることができます。あなたが達成したいことはあまり明白ではありません。例が役立つかもしれません。 – Yahya

+0

これを編集しましたが、これがややクリアしてくれることを願っています – TheFullMonty

答えて

1

ステップでこのステップを実行します。

第1工程:人に報告をどのように多くの社員数を。

select reportsto, count(*) from employee group by reportsto; 

ほとんどの記者をしている人を取得するように我々は、COUNT(*)で、この結果を注文すると、1行のみ取得することを制限することができます。問題となるのは、同点の場合、つまり2人の記者が同じ最高額の記者を抱えている場合、何をすべきか? SQLiteはここではあまり役に立ちません。

select reportsto 
from employee 
group by reportsto 
having count(*) = 
(
    select count(*) 
    from employee 
    group by reportsto 
    order by count(*) desc 
    limit 1 
); 

次のステップ:名前を取得します。つまり、テーブルに再度アクセスする必要があります。

select 
    firstname || ' ' || lastname as manager 
from employee 
where e1.employeeid in 
(
    select reportsto 
    from employee 
    group by reportsto 
    having count(*) = 
    (
    select count(*) 
    from employee 
    group by reportsto 
    order by count(*) desc 
    limit 1 
) 
); 

最後のステップ:見つかった管理者自身が報告した人を取得します。これらは多くの場合がありますので、マネージャーごとにグループ化し、報告するすべてのものを連結します。

select 
    e1.firstname || ' ' || e1.lastname as manager, 
    group_concat(e2.firstname || ' ' || e2.lastname) as reportsto 
from employee e1 
join employee e2 on e2.employeeid = e1.reportsto 
where e1.employeeid in 
(
    select reportsto 
    from employee 
    group by reportsto 
    having count(*) = 
    (
    select count(*) 
    from employee 
    group by reportsto 
    order by count(*) desc 
    limit 1 
) 
) 
group by e1.firstname || ' ' || e1.lastname; 
+0

ありがとう、これは私が探していたものです。 – TheFullMonty

-1
SELECT e.ReportsTo AS TopManagersEmployeeId, COUNT(e.ReportsTo) AS ReportedBy, m.FirstName + ' ' + m.LastName AS TopManagersName, mm.FirstName + ' ' + mm.LastName AS TheirManagersName FROM Employees e 
JOIN Employees m 
ON e.ReportsTo = m.EmployeeID 
JOIN Employees mm 
ON m.ReportsTo = mm.EmployeeID 
GROUP BY e.ReportsTo, m.FirstName, m.LastName, mm.FirstName, mm.LastName 

をReportTo TOP 1など。また、JOINで遊んで、マネージャのマネージャー(mm)が検索されている2番目のセットでINNER JOINにすることもできます。