は、私はこの出力を得ることができますどのようにこのSQL入力テーブルアイテムが属しているグループごとに列を出力する方法はありますか?
GroupId Item
1 Fish
1 FishBowl
2 Fish
3 Fish
を考えると?
Item IsInGroup1 IsInGroup2 IsInGroup3
Fish Y Y Y
FishBowl Y N N
基の数は一般的に、変数
は、私はこの出力を得ることができますどのようにこのSQL入力テーブルアイテムが属しているグループごとに列を出力する方法はありますか?
GroupId Item
1 Fish
1 FishBowl
2 Fish
3 Fish
を考えると?
Item IsInGroup1 IsInGroup2 IsInGroup3
Fish Y Y Y
FishBowl Y N N
基の数は一般的に、変数
ことができることに注意してください、あなたは標準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"へのリンクを残しておきます。
これは、使用しているデータベースによって異なります。これは私の作品:
は アイテム、 を選択した場合(グループID = 1、 'Y'、 'N')IsInGroup1
として、 IF(グループID = 2、 'Y'、 'N')IsInGroup2
として、 をIF(GroupId = 3、 'Y'、 'N')As IsInGroup3
FROM New Table
GROUP BY 項目;
MySQLの構文に似ています。 Microsoft SQL ServerはGROUP BYの使用について不平を言います。また、MS SQL Serverには、MySQLと同じように機能するIF()関数がありません。 –
ANSIとの互換性のためには、GROUP BYにない結果または集合の集合関数の結果を返すことができないため、MAX(GroupId)を使用する必要があります。 –
mostfrequentlyaskedquestionsはSOです。
基本的には、動的SQLを使用して、グループの数と各グループの名前を決定することによってBill Karwinが与える形式のクエリを構築できます。生成するクエリには、ANSI SQLを使用できます。また、Billが言及したSQL Server 2008(2005以降)のPIVOT演算子の独自の構文を生成することもできます。
first linkの私の例はかなり明確です。
テーブルスキーマとテストデータを投稿してください。 PIVOT演算子を使用するように指示するには、応答するユーザーにはその必要がありませんが、それは良い方法です。 –
可変グループのピボットはどのように機能しますか? –
GroupId列の値ごとに1つの列が作成されます。あなたの例では、[1]、[2]、[3]という3つの列があります。 http://msdn.microsoft.com/en-us/library/ms177410.aspxを参照してください。 –