2016-09-20 5 views
1

は、私が学生の契約とtheire歴史の中で別の契約を持っていた従業員のNamesを取得したい、次のデータ構造グループ、場所、論理演算子をどのように組み合わせるか?

| Name | Contract Type | 
|:------|--------------:| 
| Frank | Student  | 
| Frank | Staff   | 
| Frank | Staff   | 
| John | Internship | 
| John | Student  | 
| John | Staff   | 
| Tim | Internship | 
| Tim | Staff   | 

を持っています。私のアプローチは

Select Name, count(Name) from table 
where ContractType = ('Student') AND (ContractType = ('Staff') OR ContractType = ('Internship'))  
group by Name having count (Name) > 1 

です。ここで問題は私はまだすべての従業員を取得することです。これを達成するのを手助けできる人は誰ですか? Nameによって

答えて

2

グループと少なくとも一度学生契約と合計で1件の以上の契約GROUP BYを使用して

Select Name 
from your_table 
group by Name 
having sum(case when ContractType = 'Student' then 1 else 0 end) > 0 
    and count(distinct ContractType) > 1 
+0

イマイチ奇妙な?一貫性を保つために私は両方で 'COUNT'を使いますが、何をしようとしているのかがはっきりしています。 –

+1

@Juan Carlos Oropeza:私は同意しない。条件付き集計で 'SUM'を使った集計は' COUNT'と同じように普通です。 –

+0

@JuanCarlosOropeza:集計 'count()'を使うには、 'count()'がNULL値をカウントせず、 –

2

持つグループのみ取る:

SELECT Name 
FROM dbo.YourTable 
GROUP BY Name 
HAVING SUM(CASE WHEN [Contract Type] = 'Student' THEN 1 ELSE 0 END) >= 1 
AND SUM(CASE WHEN [Contract Type] <> 'Student' THEN 1 ELSE 0 END) >= 1; 

をしかし、あなたはまた、EXISTSを使用することができます:

SELECT DISTINCT A.Name 
FROM dbo.YourTable A 
WHERE EXISTS(SELECT 1 FROM dbo.YourTable 
      WHERE Name = A.Name 
      AND [Contract Type] = 'Student') 
AND EXISTS(SELECT 1 FROM dbo.YourTable 
      WHERE Name = A.Name 
      AND [Contract Type] <> 'Student'); 
2

ここでテスト
SELECT name 
FROM table 
GROUP BY name 
HAVING COUNT(*) > 1 
AND name IN 
(SELECT name 
FROM table 
WHERE contracttype = 'student') 

:nはまたINその後、GROUP BYを使用して、カウントする `SUM`を使用して、` COUNT` http://sqlfiddle.com/#!9/38fa36/1

+0

'and name in()'部分は 'where'節ではなく' having'節にあるので、これはうまくいきません。 –

+0

まだ動作しません。 WHEREはサブクエリの中にあり、私たちは良いです。 http://sqlfiddle.com/#!9/38fa36/1 – kbball

+0

OPはMySQLではなくSQL Serverを使用しています。そして、MySQLのこの "機能"は、それが使用されているという混乱を引き起こします。 –