2016-10-12 12 views
0

このようなクエリを作成する方法はありますか?MS SQL - グループに値が存在するかどうかを確認するサブクエリ

は10個の値を有し、表は2つのが100の値を有する。

表:

id | name | value | weekStart | weekEnd  | superValue 
-----+--------+-------+------------+-------------+----------- 
1 | tom | 1 | 2016-01-01 | 2016-01-07 | A 
2 | tom | 1 | 2016-08-01 | 2016-01-14 | E 
3 | mark | 0 | 2016-01-01 | 2016-01-07 | A 

表:私は自分の名前に基づいて(一つのレコードの多くに)それらに入社した後、名前によってそれらをグループ化している

id | name | age 
-----+--------+---- 
1 | tom | 16 
2 | Xavier | 19 
3 | mark | 20 
4 | bob | 20 
5 | alan | 35 

我々はこのようなresault何かがあるように:

id | name | value | (min)weekStart | (max)weekEnd 
-----+--------+-------+----------------+------------- 
1 | tom | 1 | 2016-01-01  | 2016-01-14 
2 | mark | 0 | 2016-01-01  | 2016-01-07 

を、この名前の値のいずれかの場合は、最初のテーブルの列(superValue)に基づいた値を持つ追加の列を表示する方法はあります値が「E」の場合は「はい」、そうでない場合は「いいえ」

id | name | value | (min)weekStart | (max)weekEnd | is it super ? 
-----+--------+-------+----------------+--------------+--------------- 
1 | tom | 1 | 2016-01-01  | 2016-01-14 | Yes 
2 | mark | 0 | 2016-01-01  | 2016-01-07 | No 
+1

あなたのタグに「MySQL」と書かれています。あなたのタイトルに「SQL Server」と書かれていますか?どちらですか? –

答えて

1

私はあなたがone.value取り扱うか、取得できませんでしたが、これは私のソリューションです: (そう、あなたが実際にこれのためにサブクエリを必要としません。)

select 
    `two`.`id`, 
    `two`.`name`, 
    max(`one`.`value`) as `value`, 
    min(`one`.`weekStart`) as `minWeekStart`, 
    max(`one`.`weekEnd`) as `maxWeekEnd`, 
    sum(if(`one`.`superValue` = 'E', 1, 0)) > 0 as `is it super?` 
from 
    `two` 
    inner join `one` 
     on (`two`.`name` = `one`.`name`) 
group by 
    `two`.`name` 
order by 
    `two`.`id`; 

それはですテーブルtwoをIDで参照し、その名前ではなく、より良いものにしてください。

EDIT:それはどのように機能するかを少し説明:

sum(if(`one`.`superValue` = 'E', 1, 0)) > 0 as `is it super?` 

合計内部の文は1を返す「場合は、」値が「E」で、それ以外の場合は0を返します。合計でこれらの0と1が加算され、最後に合計が0より大きいかどうかがチェックされます。つまり、少なくとも1つの 'E'値があったかどうかを確認します。

+0

はOKですが、 'super Values'がintの場合はどうなりますか... sumはそれらの値を追加します。 –

+0

"sum"には "if"文が含まれているため、これはありません。 if文の結果が集計されます。つまり、sum(if( 'one'.superValue' = 666,1,0))> 0のように変更します。私は答えに説明を追加します。 –

0

はい可能です。 caseを使用してselectに別の列を追加するだけです。表1の内部結合または実際の名前で与えられた場合、table-oneをtable-oneの別名で置き換えます。

select <existing-columns>,Case when Max(table-one.superValue) = 'E' then 'yes' else 'no' end as [is-it-super] 
from <existing-joins> 
+0

これも私の問題を解決する可能性がありますが、私は 'スーパー値'としてintを持っていた場合はどうなりますか? Minは最低値のみを比較します。 –

+0

'supervalue'がintの場合、 'supervalue'列の最大値を 'E'にマップすることができます –

関連する問題