web-dev-qa-db-ja.com

GROUP BYで列のエイリアスを使用する

2つの列をチェーンするクエリがあります。エイリアスnotGROUP BY句で機能するのに、ORDER BY句では機能するのはなぜですか?選択を正しく書くにはどうすればよいですか?

SELECT
  KOS_VER_ID        AS "Vertrag"
  , WHR_ISO_3_CODE  AS "Waehrung"
  , KOS_KOA_ST_KZN || '  -  ' || ST_LANGBEZ_EN as "Kostenart"
  , SUM (KOS_BETRAG) AS "Summe pro KOA"
FROM
  KOSTEN
  , WAEHRUNG
  , SCHLUESSELTABELLE
WHERE 
  KOSTEN.KOS_VERHI_WHR_ID = WAEHRUNG.WHR_ISO_ID
  AND KOSTEN.KOS_KOA_ST_KZN = SCHLUESSELTABELLE.ST_ID
  AND KOS_VER_ID in (2509, 2510, 2511)
GROUP BY
  KOS_VER_ID
  , WHR_ISO_3_CODE
  , KOS_KOA_ST_KZN || '  -  ' || ST_LANGBEZ_EN
ORDER BY
  "Vertrag"
  , "Kostenart"
;
5
Konrad

エイリアスがGROUP BY句で機能しないのはなぜですか

これらは単に構文規則だからです。列のエイリアスはORDER BY句で使用できますが、GROUP BY句では使用できません。

構文図を見ると、これが明らかになります。

order by句は次のように定義されますenter image description here

したがって、ORDER BYの後に式が許可された後、位置(order by 1)またはc_aliasは「列のエイリアス」を表します。

group byは次のように定義されます

enter image description here

ご覧のように、その後にc_aliasオプションがないため、列のエイリアスを使用できません。

これはOracleにとって特別なことではありません。これは、SQL標準での定義方法です。

@a_horse_with_no_nameで言及されている構文の制限は、SQLデータベースエンジンによってクエリが論理的に処理される方法を単に反映したものです。

  1. ビュー定義を解決した後、FROM句が処理され、必要なすべてのテーブルが識別されます。
  2. WHERE句が処理され、述語がテーブルの行に適用されます。
  3. GROUP BY句が処理され、WHEREの後に残っている行に集計関数が適用されます。
  4. HAVING句が処理され、GROUP BYの出力に追加の述語が適用されます。
  5. SELECTリストが処理され、要求された列が取得され、場合によってはエイリアスが割り当てられます。
  6. ORDER BY句が処理され、SELECTリスト処理の後であるため、割り当てられたエイリアスにアクセスできます。
3
mustaccio

コード評価は、SELECTステートメントの論理処理順序に従います。

エイリアスは、前のステップで導入された場合にのみ使用できます。そのため、SELECT句のエイリアスはORDER BYで使用できますが、GROUP BY句では使用できません。

リファレンスMicrosoft T-SQL Documentation 詳細については、.

  1. から
  2. オン
  3. 参加する
  4. どこ
  5. GROUP BY
  6. WITH CUBEまたはWITH ROLLUP
  7. 持っている
  8. 選択する
  9. 明確な
  10. 注文する

お役に立てれば。

また、 関連する議論

1
Pankil Shah