2017-10-13 6 views
1

式の結果をGROUP BY句に含め、式の出力を選択するにはどうすればよいですか?TSQLの式でグループ分けして結果をキャプチャする方法は?

は、私はこのテーブルを持っていると言う:

╔════════════════════════╦═══════════╦═══════╗ 
║   Forest   ║ Animal ║ Count ║ 
╠════════════════════════╬═══════════╬═══════╣ 
║ Tongass    ║ Hyena  ║ 600 ║ 
║ Tongass    ║ Bear  ║ 1200 ║ 
║ Mount Baker-Snoqualmie ║ Wolf  ║ 30 ║ 
║ Mount Baker-Snoqualmie ║ Bunny  ║  2 ║ 
║ Ozark-St. Francis  ║ Pigeon ║ 100 ║ 
║ Ozark-St. Francis  ║ Ostrich ║  1 ║ 
║ Bitterroot    ║ Tarantula ║ 9001 ║ 
╚════════════════════════╩═══════════╩═══════╝ 

(もしあれば)私は、各フォレスト内の肉食動物の数と非肉食動物の数の行と列を必要としています。

╔════════════════════════╦═══════════════╦═══════════════╗ 
║   Forest   ║ AnimalsOfType ║ AreCarnivores ║ 
╠════════════════════════╬═══════════════╬═══════════════╣ 
║ Tongass    ║   1800 ║    1 ║ 
║ Mount Baker-Snoqualmie ║    2 ║    0 ║ 
║ Mount Baker-Snoqualmie ║   30 ║    1 ║ 
║ Ozark-St. Francis  ║   101 ║    0 ║ 
║ Bitterroot    ║   9001 ║    1 ║ 
╚════════════════════════╩═══════════════╩═══════════════╝ 

動物は肉食であるかどうかについての情報は、式の中でエンコードされている:これは私がこの例では、探しています出力されます。

SELECT TOP (1000) 
    [Forest], 
    SUM([COUNT]) AS AnimalsOfType, 
    AreCarnivores 
FROM [Tinker].[dbo].[ForestAnimals] 
GROUP BY 
    Forest, 
    CASE WHEN ForestAnimals.Animal IN ('Pigeon', 'Ostrich', 'Bunny') THEN 0 ELSE 1 END AS AreCarnivores 

しかし、これが有効なTSQL構文ではありません。私がやりたいのは何

は、グループごとに式を含め、select句でその結果を参照しています。

SELECTで関数を再実行できるようにするために、動物列をGROUP BY句に含めると、動物の種類ごとに1行が表示されますが、これは目的の動作ではありません。

異なるテンポラリテーブルを選択して結果を結合するのは望ましくありません。このクエリの実際のバージョンでは、同じ結果セットでこの動作が必要な多数の式があり、非常に扱いにくいストアドプロシージャになるからです。

WITH X AS (
    SELECT Forest, Animal, Count, 
     CASE WHEN ForestAnimals.Animal IN ('Pigeon', 'Ostrich', 'Bunny') 
       THEN 0 
       ELSE 1 END AS AreCarnivores 
    FROM [Tinker].[dbo].[ForestAnimals] 
) 
SELECT Forest, SUM(Count) AS AnimalsOfType, AreCarnivores 
FROM X 
Group by Forest, AreCarnivores; 

それともについてのより詳細なこと、自分自身を繰り返します:

+0

この機能を表示できますか?入力と出力を見る必要があります。 – Parfait

+0

私はここで "機能"は赤ちゃんだと思います。 UDFであってもなくてもよい表現が必要です。 –

+0

きれいにフォーマットされたテーブルのためにUpvoted! – pcdev

答えて

2

は、CTEを使用

SELECT Forest, SUM(Count) AS AnimalsOfType, 
     CASE WHEN ForestAnimals.Animal IN ('Pigeon', 'Ostrich', 'Bunny') 
       THEN 0 
       ELSE 1 END AS AreCarnivores 
FROM [Tinker].[dbo].[ForestAnimals] 
GROUP BY Forest, CASE WHEN ForestAnimals.Animal IN ('Pigeon', 'Ostrich', 'Bunny') 
       THEN 0 
       ELSE 1 END; 

彼らはオプティマイザと同等のクエリです。

関連する問題