2016-04-07 6 views
0

別の列の各IDに基づいて異なる項目の数をカウントしたいと思います。例えばgroup by節に基づいて異なる項目をカウントする

Color  Value 
Red  1 
Red  1 
Red  2 
Red  2 
Blue  3 
Blue  3 

私は赤が2つの異なる値を持っていることを示すために、カウントをしたいとブルーは、ときにのみ個別のカウント数を1 を持っており、それらの個別値の高い持つ行を取り除きますこの場合、色は赤、値は2となる行を取り除きたいと思います。

Color  Value 
Red  1 
Red  1 
Blue  3 
Blue  3 

は、ここに私の本当のクエリです:この場合FormSectionIDは、色となり、myrankが値となります。これをサブクエリとして使用して、私が望むものを得る方法はありますか?

SELECT DISTINCT TFormSectionID AS FormSectionID, 
    TFSSortOrder AS SectionSortOrder, 
    TSectionItemID AS SectionItemID, 
    TrendType, 
    DENSE_RANK() OVER (ORDER BY TFSSortOrder) AS myrank 
FROM Report.TrendData 
WHERE (ProgramID = 9) AND (TrendType > 0) 

実データ

FormSectionID SectionSortOrder SectionItemID TrendType Rank 
12     7     90   1    1 
12     7     91   1    1 
12     7     154   1    1 
12     7     528   1    1 
12     9     154   1    2 
12     9     528   1    2 
+0

期待される結果に2列のBlueがあるのはなぜですか? – Squirrel

+0

ブルーの値では、別個のカウントが1より大きくならないためです。青の値には3しか含まれていません。 – James

+0

@Squirrel彼は、そのグループの最小値ではないカラーグループの任意の値をフィルタリングしたいと思うと思います。 –

答えて

1

あなたは、サブクエリで巧妙なINNER JOINを使用することができます。

SELECT c1.Color, c1.Value 
FROM colors c1 
INNER JOIN 
(
    SELECT Color, MIN(VALUE) AS minValue 
    FROM colors 
    GROUP BY Color 
) c2 
    ON c1.Color = c2.Color AND c1.VALUE = c2.minValue 
+0

私はこれを試してみる – James

+0

c1.Valueについては、実際は私の場合はエイリアスです。それは無効な列名を言っています、あなたはこの問題を回避する方法を知っています – James

+0

あなたは私たちにあなたの実際のデータを表示しないという間違いを犯しました。あなたの質問を更新してください。 –

0

は何をしたいということですか?

declare @tbColor as table (color nvarchar(5),value int) 

insert into @tbColor select 'Red','1' 
insert into @tbColor select 'Red','1' 
insert into @tbColor select 'Red','2' 
insert into @tbColor select 'Red','2' 
insert into @tbColor select 'Red','3' 
insert into @tbColor select 'Blue','3' 
insert into @tbColor select 'Blue','3' 
insert into @tbColor select 'Blue','4' 

select color,value,count(*) as distinctValue from @tbcolor group by color,value