2009-06-16 12 views
0

は、私はこの出力を得ることができますどのようにこのSQL入力テーブルアイテムが属しているグループごとに列を出力する方法はありますか?

GroupId Item 
1   Fish 
1   FishBowl 
2   Fish 
3   Fish 

を考えると?

Item  IsInGroup1 IsInGroup2 IsInGroup3 
Fish  Y   Y   Y 
FishBowl Y   N   N 

基の数は一般的に、変数

+0

テーブルスキーマとテストデータを投稿してください。 PIVOT演算子を使用するように指示するには、応答するユーザーにはその必要がありませんが、それは良い方法です。 –

+0

可変グループのピボットはどのように機能しますか? –

+0

GroupId列の値ごとに1つの列が作成されます。あなたの例では、[1]、[2]、[3]という3つの列があります。 http://msdn.microsoft.com/en-us/library/ms177410.aspxを参照してください。 –

答えて

2

ことができることに注意してください、あなたは標準SQLでグループの可変数を行うことはできません。あらかじめグループを知っておく必要があります。これは、どのSQLクエリも列の数とその名前を知っている必要があるためです。

SELECT Item, 
    MAX(CASE GroupId WHEN 1 THEN 'Y' ELSE 'N' END) AS IsInGroup1, 
    MAX(CASE GroupId WHEN 2 THEN 'Y' ELSE 'N' END) AS IsInGroup2, 
    MAX(CASE GroupId WHEN 3 THEN 'Y' ELSE 'N' END) AS IsInGroup3 
FROM ThisInputTable 
GROUP BY Item; 

Microsoft SQL ServerにはPIVOTテーブルの機能がありますが、これは標準SQLではありません。私はマイクロソフトのユーザーではないので、 "Using PIVOT and UNPIVOT"へのリンクを残しておきます。

0

これは、使用しているデータベースによって異なります。これは私の作品:

は アイテム、 を選択した場合(グループID = 1、 'Y'、 'N')IsInGroup1として、 IF(グループID = 2、 'Y'、 'N')IsInGroup2として、 をIF(GroupId = 3、 'Y'、 'N')As IsInGroup3 FROM New Table GROUP BY 項目;

+0

MySQLの構文に似ています。 Microsoft SQL ServerはGROUP BYの使用について不平を言います。また、MS SQL Serverには、MySQLと同じように機能するIF()関数がありません。 –

+0

ANSIとの互換性のためには、GROUP BYにない結果または集合の集合関数の結果を返すことができないため、MAX(GroupId)を使用する必要があります。 –

1

mostfrequentlyaskedquestionsはSOです。

基本的には、動的SQLを使用して、グループの数と各グループの名前を決定することによってBill Karwinが与える形式のクエリを構築できます。生成するクエリには、ANSI SQLを使用できます。また、Billが言及したSQL Server 2008(2005以降)のPIVOT演算子の独自の構文を生成することもできます。

first linkの私の例はかなり明確です。

関連する問題