副選択を使用して結果セットに列を追加するSQLクエリ(MSSQLSERVER)があります。
SELECT P.name,
(select count(*) from cars C where C.type = 'sports') AS sportscars,
(select count(*) from cars C where C.type = 'family') AS familycars,
(select count(*) from cars C where C.type = 'business') AS businesscars
FROM people P
WHERE P.id = 1;
上記のクエリは、少しナンセンスなテストセットアップからのものですが、私が思う例としては十分に機能します。私が実際に取り組んでいるクエリは、目前の問題から気をそらすだけの複雑なテーブルにまたがっています。
上記の例では、テーブル「people」の各レコードには、「wantsSportscar」、「wantsFamilycar」、「wantsBusinesscar」の3つの追加列もあります。ここで私がやりたいのは、peopleテーブルのそれぞれの「wants.....」フィールドが「true」に設定されている場合にのみ、追加の各列の副選択を行うことです。つまり、P.wantsSportscarがその特定の人物に対してtrueに設定されている場合にのみ、最初の副選択を実行したいと思います。2番目と3番目の副選択も同様に機能するはずです。
したがって、このクエリが機能する方法は、特定の人の名前と、その人が所有したい車のタイプに使用できるモデルの数を表示することです。私の最終結果セットには、常に1つのレコード、つまり1人の特定のユーザーのレコードしか含まれないことに注意してください。
特定の種類の車に興味がない場合は、その種類の列が最終結果セットに含まれないことが重要です。これが明確であることを確認するための例:
人物Aがスポーツカーとファミリーカーを希望する場合、結果には「名前」、「スポーツカー」、「ファミリーカー」の列が含まれます。
人物Bがビジネスカーを希望する場合、結果には「name」列と「businesscar」列が含まれます。
IF、CASE、およびEXISTSステートメントとさまざまな組み合わせを使用しようとしていますが、これまでのところ、構文的に正しい解決策を得ることができませんでした。これが可能かどうか誰かが知っていますか?クエリはストアドプロシージャに保存されることに注意してください。