2009-03-09 14 views
10

私はMS SQL Serverに何かを移植しようとしているMySQLユーザーです。T-SQL GROUP BY:他のグループ化された列を含めるベストな方法

私はテーブルのカップルに参加し、GROUP BYを経由して列の一部を集約しています。

簡単な例は、従業員とのプロジェクトのようになります。

select empID, fname, lname, title, dept, count(projectID) 
from employees E left join projects P on E.empID = P.projLeader 
group by empID 

...それは、MySQLで動作しますが、MS SQLは厳しいですし、すべてがどちらかで、集計関数で囲まれたかの一部であることが必要ですGROUP BY句。

ので、当然のことながら、この単純な例では、私はちょうど句によって、グループ内の余分な列が含まれる可能性が想定しています。しかし、私が扱っている実際のクエリは非常に複雑で、いくつかの集計されていない列に対して実行された一連の操作が含まれています。つまり、group by節にそれらのすべてを含めることは本当に醜いでしょう。

これを行うには良い方法がありますか?

+0

@Dan、私の答えを見て、それはあなたの道に沿っていくつかのトラブルを救うください... – eglasius

答えて

15

あなたはそれがこれらの線の周りに何かで動作するように取得することができます。

select e.empID, fname, lname, title, dept, projectIDCount 
from 
(
    select empID, count(projectID) as projectIDCount 
    from employees E left join projects P on E.empID = P.projLeader 
    group by empID 
) idList 
inner join employees e on idList.empID = e.empID 

あなたは避けるこの方法余分なグループを操作して、必要なデータを取得することができます。また、いくつかのシナリオでインデックスをうまく活用するチャンスがあります(完全な情報が返されていない場合)。また、ページングとの組み合わせも可能です。

+0

はい、私は選択の数があった気付かなかったような構文を更新する必要がありましたリスト。このようにする理由についての情報も追加しました。 – eglasius

4

「それは、GROUP BY句でそれらのすべてを含めるようにしようとする本当に醜いなるだろう。」

うん - それは*それを行うための唯一の方法だ - ちょうどコピーして、group by句に非凝集列を貼り付け、エイリアスを削除し、それが恋愛小説家だ...

*あなたは可能性がありSQL標準に準拠し、技術的にではない - - ネストされたSELECTでそれを包むが、それはおそらく同じように醜いです...

2

MySQLは異例であるあなたは、GROUP BY句から項目を省略することが可能に。標準SQLでは、select-listの非集約カラムは、GROUP BY句の中に完全にリストされていなければなりません(名前または序数のどちらかで、非推奨カラムです)。

(MySQLは珍しいですが、ああ、それは速記を可能にすることをいいです。)

1

あなたがそれを必要としない従業員からのEMPIDに基づいてグループを作成するようサブクエリに参加する必要はありません - あなたは、プロジェクトからprojectLeaderフィールドでそれを行うことができます。インナー付き

あなたは、少なくとも一つのプロジェクトを持っている従業員のリストを取得します(私は置くとして)参加します。あなたはすべての従業員のリストが必要な場合だけにも適しかもしれない

select e.empID, e.fname, e.lname, e.title, e.dept, p.projectIDCount 
    from employees e 
    inner join (select projLeader, count(*) as projectIDCount 
        from projects 
       group by projLeader 
      ) p on p.projLeader = e.empID 
0

SELECT句のサブクエリに参加左に変更します。与えられた例ではうまくいくが、あなたが扱っている実際の複雑なクエリではそうでないかもしれない。

select 
     e.empID, fname, lname, title, dept 
     , (select count(*) from projects p where p.projLeader = e.empId) as projectCount 
from 
    from employees E 
関連する問題