SQL SERVER 同一クエリ内での別名参照

このQ&Aのポイント
  • SQL Serverで同一クエリ内での別名参照を行いたいが、エラーが表示される。
  • 種別による条件分岐を行い、支給割合を作成しようとしたがエラーが発生。
  • CASE式を使用して最終粗利益を作成したいが方法がわからない。
回答を見る
  • ベストアンサー

SQL SERVER 同一クエリ内での別名参照

いつもお世話になります。 下記内容のクエリを作成したのですが、「エラー:列名’支給割合’が無効です」と表示されてしまいます。 SELECT CASE WHEN 種別 = 'A' THEN 0.5 ELSE 0.3 END AS 支給割合, CASE WHEN 進捗 = '完了' THEN ISNULL(粗利, 0) * 支給割合 ELSE NULL END AS 支給分 FROM dbo.取引マスタ 種別より、CASE式で支給割合を作成し、進捗より粗利に対して支給割合を掛ける関数を作成しようと思ったのですが、上記の通りエラーになってしまいます。 Accessと同様に同一のクエリ内で式に別名を指定して参照は出来ないのでしょうか?(表現が下手で申し訳ありません) ここからさらにCASE式を足して最終粗利益等を作成したいのですが・・・・ 使用DB:SQL Server 2008 R2 express edition 検索でも目当ての回答が見つけられず、こちらで質問をさせて頂きました。 ご教授を宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

SELECT 支給割合,CASE WHEN 進捗='完了' THEN ISNULL(粗利,0) *支給割合 ELSE NULL END AS 支給分 FROM (SELECT CASE WHEN 種別='A' THEN 0.5 ELSE 0.3 END AS 支給割合,進捗,粗利 FROM dbo.取引マスタ)AS T です。

hiyoko3099
質問者

お礼

ありがとうございます。 期待通りの計算結果になりました。 大変恐縮なのですが、こちらの構文の解説のあるアドレス等を教えて頂けないでしょうか・・・・・ Accessとは勝手が違いすぎて、どうにも理解できず進められなくて・・・・・ 宜しくお願いできればと思います

その他の回答 (1)

回答No.2

>こちらの構文の解説のあるアドレス等を教えて頂けないでしょうか 各RDBMSにより微妙に文法が異なるので、RDBMS付属のマニュアルを読まれると良いです。

関連するQ&A

  • CASE式を使ったクエリ

    <環境>SQLSERVER2005 件名について教えてください。 テーブル("TBL")にフィールドMONEY1~MONEY12までがあります。 MONEYの後ろの数字は月を表しています。 このテーブルから 1.MONEY12の値≠0円ならMONEY12の値。MONEY12の値=0円ならMONEY11の値を参照。 2.MONEY11の値≠0円ならMONEY11の値。MONEY11の値=0円ならMONEY10の値を参照。 3.MONEY10の値≠0円ならMONEY10の値。MONEY10の値=0円ならMONEY9の値を参照。 と0円でない月までさかのぼってその月の金額を求めたいのですが、 下記のようにCASE式を使うと「Case 式は、10 レベルまでしか入れ子にできません。」と エラーになります。 条件式が11レベル以上の場合抽出する方法はないのでしょうか SELECT CASE WHEN MONEY12>0 THEN MONEY12 ELSE CASE WHEN MONEY11>0 THEN MONEY11 ELSE CASE WHEN MONEY10>0 THEN MONEY10 ELSE CASE WHEN MONEY9>0 THEN MONEY9 ELSE CASE WHEN MONEY8>0 THEN MONEY8 ELSE CASE WHEN MONEY7>0 THEN MONEY7 ELSE CASE WHEN MONEY6>0 THEN MONEY6 ELSE CASE WHEN MONEY5>0 THEN MONEY5 ELSE CASE WHEN MONEY4>0 THEN MONEY4 ELSE CASE WHEN MONEY3>0 THEN MONEY3 ELSE CASE WHEN MONEY2>0 THEN MONEY2 ELSE CASE WHEN MONEY1>0 THEN MONEY1 ELSE 0 END END END END END END END END END END END END FROM TBL

  • SQL Server Where句 Case文

    お世話になります。 Where句のCase文でお尋ねしたいことがあります。 ----------------------------------------------------- WHERE (A = @A) AND (B = @B) AND (C = @C) AND CASE WHEN @D = 0 THEN (dbo.TEST.D = dbo.TEST.D) '全データを WHEN @D = 1 THEN (dbo.TEST.D = 1) '値が1のデータを WHEN @D = 2 THEN (dbo.TEST.D = Is Null) 'データがNull のものを END AND (E = @E) AND (F = @F) AND (G = @G) AND (H = @H) AND CASE WHEN @I = 0 THEN (dbo.TEST.I = dbo.TEST.I) WHEN @I = 1 THEN (dbo.TEST.I = 1) WHEN @I = 2 THEN (dbo.TEST.I = Is Null) END AND (J = @J) ........ ........ ----------------------------------------------------- 上記のように CASE 文で パラメータの値により条件を変えたいのですが、なかなかうまくいきません。こんな記述の仕方ではダメということは薄々わかっているのですが、このようなCASE文をうまく動作させるにはどのように記述すればいいでしょうか? よろしくお願いいたします。

  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • 別名フィールドの型を指定

    例えば以下のようなSQL文からビューを作成した場合 SELECT CASE WHEN start_date IS NULL THEN '2010-01-01' WHEN start_date = '0000-00-00' THEN '2010-01-01' ELSE start_date END AS end_date FROM table_a start_dateフィールドはdate型ですが、別名が設定されるend_dateはvarchar型になってしまいます。 これをdate型にしてビューを作成する方法はありませんでしょうか。

  • SQLの構文エラー

    いつもお世話になってます。 現在、VBでSQLを発行し、ACCESSのテーブル(テストデータ)より 値を取得しようとしているのですが、 SQL文の発行時に構文エラーとなってしまいます。 詳細を下記しますので、ご教授頂けたらと思います。 宜しくお願い致します。 【SQL文】 select フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド10*-1 else フィールド10 end)いいい from テストデータ ※フィールド9、フィールド10は数値型、その他はテキスト型です。 実行時エラー'3075' クエリ式'(CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ'の構文エラー:演算子がありません。

  • SQLのグループ化動作について

    グループ化と集計関数の動作について質問させてください。 MySQL、SQLiteて実行しました。 [テーブル:ninzu_tbl] ken sex ninzu 福岡 1 50 福岡 2 60 佐賀 1 40 佐賀 2 30 長崎 1 60 長崎 2 50 性別(sex)でgroup byして人数を求めるSQLを実行した場合、 sumを使用するSQL(1)を実行すると福岡、佐賀、長崎のそれぞれの人数が表示されますが、 sumを使用しないSQL(2)を実行した場合、長崎の人数のみが表示され、福岡、佐賀の人数が 空白になります。 group byでグループ化した場合に、最後尾のキー項目以外のデータが 上書きされ、福岡、佐賀のデータが飛んでしまったのではと考えましたが、 (1)を実行した場合に県ごとのデータが表示される理由がわかりません。 理由がわかる方、教えていただけませんか? もしくは、グループ化の処理イメージができるサイトを教えてください。 よろしくお願いします。 (1) 結果が表示されるSQL select sex as '性別' , sum(case when ken = '福岡' then ninzu else null end) as '福岡' , sum(case when ken = '佐賀' then ninzu else null end) as '佐賀' , sum(case when ken = '長崎' then ninzu else null end) as '長崎' from ninzu_tbl group by sex (2) 福岡と佐賀の結果が表示されないSQL select sex as '性別' , case when ken = '福岡' then ninzu else null end as '福岡' , case when ken = '佐賀' then ninzu else null end as '佐賀' , case when ken = '長崎' then ninzu else null end as '長崎' from ninzu_tbl group by sex

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • sqlについての質問

    お世話になります。 下記コードにて、抽出されたデータに不備があります。 「q2.新新品番(+) = A.品番」としていますが、 完全一致しない品番が見受けられ、trimを使ったら 良いのではと思うのですが、どこにtrimを入れたら 良いのか、又は考え方自体違うのか 現在テンパっている所でございます。 どなたか良いアドバイスを頂けたらと思い、 ご質問させて頂きました。 何卒、ご教示頂けます様、宜しくお願い致します。          記 select case when substr(q2.新新品番,8,1)='_' then substr(q2.新新品番,1,7) else q2.新新品番 end as 品番 ,SUM(q2.新新合格数) AS 生産合格数 ,A.伝票ID,A.品番,A.新入庫数量 as 区画入庫数,A.区画番号 from ( select case when substr(q1.新品番,6,1)='_' then substr(q1.新品番,1,5) else q1.新品番 end as 新新品番 ,SUM(q1.新合格数) AS 新新合格数 from ( SELECT 更新日時, case when substr(ハンドル,7,1)='_' then substr(ハンドル,1,6) else ハンドル end as 新品番 ,SUM(合格本数) AS 新合格数 FROM D最終検査履歴 WHERE 更新日時 BETWEEN '2012-5-31' and '2012-6-01' group by 更新日時, case when substr(ハンドル,7,1)='_' then substr(ハンドル,1,6) else ハンドル end )q1 group by case when substr(q1.新品番,6,1)='_' then substr(q1.新品番,1,5) else q1.新品番 end )q2 , (select 伝票ID,品番,sum(入庫数量)as 新入庫数量,区画番号 from D屋外入庫 where 登録日時 between '2012-5-31' and '2012-6-01' and 伝票ID='SN' group by 伝票ID, 品番, 区画番号 )A where q2.新新品番(+) = A.品番 group by case when substr(q2.新新品番,8,1)='_' then substr(q2.新新品番,1,7) else q2.新新品番 end, A.伝票ID, A.品番, A.新入庫数量, A.区画番号

  • CASE文について

    <環境> SQLSERVER2005 ACCESS2007 CASE文について質問です。 クエリで下記のSQL文を実行すると、「Case 式は、10 レベルまでしか入れ子にできません。」 とエラーになります。 このような場合、どのように記述すれば解決できるでしょうか? ご教授お願いします。 SELECT CASE WHEN (WA.MM = '01') THEN ROUND(SUM(WB.MONEY1), -3, 0) ELSE CASE WHEN (WA.MM = '02') THEN ROUND(SUM(WB.MONEY2), -3, 0) ELSE CASE WHEN (WA.MM = '03') THEN ROUND(SUM(WB.MONEY3), -3, 0) ELSE CASE WHEN (WA.MM = '04') THEN ROUND(SUM(WB.MONEY4), -3, 0) ELSE CASE WHEN (WA.MM = '05') THEN ROUND(SUM(WB.MONEY5), -3, 0) ELSE CASE WHEN (WA.MM = '06') THEN ROUND(SUM(WB.MONEY6), -3, 0) ELSE CASE WHEN (WA.MM = '07') THEN ROUND(SUM(WB.MONEY7), -3, 0) ELSE CASE WHEN (WA.MM = '08') THEN ROUND(SUM(WB.MONEY8), -3, 0) ELSE CASE WHEN (WA.MM = '09') THEN ROUND(SUM(WB.MONEY9), -3, 0) ELSE CASE WHEN (WA.MM = '10') THEN ROUND(SUM(WB.MONEY10), -3, 0) ELSE CASE WHEN (WA.MM = '11') THEN ROUND(SUM(WB.MONEY11), -3, 0) ELSE CASE WHEN (WA.MM = '12') THEN ROUND(SUM(WB.MONEY12), -3, 0) END END AS MONEY FROM (WA INNER JOIN WB ON (WA.YYYY = WB.YYYY)) INNER JOIN WC ON (WA.YYYY = WC.YYYY)

  • SQLserver2005 nvarchar を float に変換中にエラー発生

    SELECT TOP (100) PERCENT ACODE * 10 + CCODE AS Aコード, ACODE * 1000 + CCODE * 100 + GCODE AS Bコード, CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END AS 番地, MIN(DISTINCT X) AS X, MIN(DISTINCT Y) AS Y FROM dbo.Tbl GROUP BY ACODE * 10 + CCODE, ACODE * 1000 + CCODE * 100 + GCODE, CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END ORDER BY 字丁目コード, 号特定コード, 番地 上記のクエリを実行すると「データ型 nvarchar を float に変換中にエラーが発生しました。」というメッセージが表示されてしまいます。 おそらく[CHIBAN]フィールドはnvarchar型のためエラーが発生していると思うのですが、 なぜ強制的にfloat型にしようとするのかわかりません。 どのように回避すればよいでしょうか。ご教示のほどお願い致します。