• ベストアンサー

SQLで式で作った項目を別の式で再利用

SQLで式で作った項目を別の式で再利用する記述が社内のAccessの中にありました。 SELECT TB1.Item1 , (TB1.Item2 * 2) as Item2x , (TB1.Item3 * 3) as Item3x , (Item2x + Item3x) as Item4 FROM TB1 ; ※実際はもっと複雑ですが Sqlserverで同じ事をするとエラーになります。 SELECT TB1.Item1 , (TB1.Item2 * 2) as Item2x , (TB1.Item3 * 3) as Item3x , ((TB1.Item2 * 2) + (TB1.Item3 * 3)) as Item4 FROM TB1 ; 何のことは無く、式をその場でもう一回書けばいいだけの話ですが、釈然としないというか、なんでそんな事すらできないのか、できない方が多分正しいのだと思うけど、なんかいい方法ありませんか?

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

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (740/5642)
回答No.3

WITHを使った方がすっきりするかも。 ---- WITH TB AS ( SELECT TB1.Item1, (TB1.Item2 * 2) AS Item2x, (TB1.Item3 * 3) AS Item3x FROM TB1 ) SELECT Item1, Item2x, Item3x, (Item2x + Item3x) AS Item4 FROM TB; ----

webuser
質問者

お礼

ありがとうございます。 WITHは使った事が無かったけど、From句で括弧の中に書くよりもスッキリしますね。

Powered by GRATICA

その他の回答 (2)

  • dell_OK
  • ベストアンサー率13% (740/5642)
回答No.2

そうですね。 私は間違えたり修正が大変になるので同じ式を何度も書きたくない時はこんな風にしています。 ---- SELECT Item1, Item2x, Item3x, (Item2x + Item3x) AS Item4 FROM ( SELECT TB1.Item1, (TB1.Item2 * 2) AS Item2x, (TB1.Item3 * 3) AS Item3x FROM TB1 ) AS TB; ----

webuser
質問者

お礼

ありがとうございます。 それもアリですね。 そのやり方はたまに使います。

Powered by GRATICA
webuser
質問者

補足

単純で単発であればコレでやります SELECT TB1.Item1 , (TB1.Item2 * 2) as Item2x , (TB1.Item3 * 3) as Item3x , ((TB1.Item2 * 2) + (TB1.Item3 * 3)) as Item4 FROM TB1 ; 複雑で単発であればコレでやります SELECT Item1, Item2x, Item3x, (Item2x + Item3x) AS Item4 FROM ( SELECT TB1.Item1, (TB1.Item2 * 2) AS Item2x, (TB1.Item3 * 3) AS Item3x FROM TB1 ) AS TB; もっと複雑であったり、再登場の可能性があれば、一旦、Viewを作ります。 でも、Accessみたいにその場で使えたら便利だな、なんかもっといい方法ないのかな、なんて思ったので質問してみました。

  • iijijii
  • ベストアンサー率55% (503/911)
回答No.1

標準SQLでは出来ません。 SQL ServerなどのDBMSはデータストアと抽出に特化しています。 表示するためのデータ加工には不向きです。 表示するためのデータ加工はDBMSで行わず、フロントエンドで行うのが筋です。 フロントエンドとデータストアを兼ねたAccessは表示するためのデータ加工もSQLで出来るように、SQLに標準外の機能を追加しているのでしょう。 2倍、3倍した数値が表示するための一時的なデータ加工じゃないならViewを作っておくと良いです。

webuser
質問者

お礼

ありがとうございます。 標準SQLではできないですよね。

Powered by GRATICA

関連するQ&A

  • PL/SQLのCREATE文でCHAR型で項目ができない

    PL/SQLで以下のようにCREATE文を発行しました。 Bテーブルの項目 項目1,'1'を持つテーブルを作成したいのです。 DECLARE  KBN CHAR(1);  WK_SQL VARCHAR2(4000); BEGIN  KBN := '1';  WK_SQL := 'CREATE TABLE A_TBL AS    SELECT B.項目1 , ' || KBN || ' AS A項目    FROM B_TBL B ' ;  EXECUTE IMMEDIATE WK_SQL; END; 結果はA_TBLの項目、A項目がどうしてもNUMBER型になるのです。初心者で、質問に不備なところもあるかもしれませんが、どうすればよいか、ご教授ください。

  • FROM SQL文 がしたい

    いつもお世話になってます。 SQL分の 「SQL1」 「SQL2」 を予めstring変数に入れておいて、 SELECT SQL1.項目x, SQL2.項目y FROM SQL1,SQL2 WHERE SQL1.項目z = SQL2.項目z ということがしたいのですが、そんなことできますか? アクセスのクエリではできたのですが。

  • 年齢分布テーブルの再集計SQL

    テーブルA 年齢,人数 20,15 21,11 22,26 .... 30,5 31,88 ... 60,5 上記テーブルAからのSQLで下記のデータが欲しいと思っております。 【欲しい結果】 年齢範囲,人数 20~24,50 25~29,33 30~34,199 ... ただし、 select '20~24'as 年齢範囲,count(*)as 人数 from テーブルA where 条件1 union select '25~29'as 年齢範囲,count(*)as 人数 from テーブルA where 条件2 union select '30~34'as 年齢範囲,count(*)as 人数 from テーブルA where 条件3 ... というSQLは使いたくないです。(テーブルAの記述が長めなので、同じものを複数記述したくないのです) また結果が 項目名:20~24,25~29,30~34,... レコード:50,33,199,... というのも遠慮したいです。 CASE文やsum、groupを使えば、できそうな気がするのですが、、、 ご教授お願い致します。

  • SQL文 について教えて下さい

    「Access」で下記のように記述するものを「SQL Server」に置き換えた場合、 どのように記述する事になるのでしょうか。 SELECT Max(CLng(mid(TestId,4,10))) AS MAX_pti_patient_id FROM patient_info WHERE TestCd1 = 1 and TestFlg = 1 どなたか分かる方がいましたら教えて下さい。 よろしくお願い致します。

  • sqlのusingについて

    SQL92標準の select * from a left outer join b using(column) の様にusingはsqlserverでは使用できないのでしょうか? on a.column = b.columnは出来ますが。。。 書き方が悪いのか、sqlserverはSQL92標準ではないのか、そもそもusingはSQL92標準ではないのか。色々webで調べてましたが、わかりませんでした。どなたか教えて下さい。

  • SQL、2つのSQLを1つで表現するには?

    <<<<クエリ8>>>> SELECT book.author, book.bookname, book.money*daityou.cnt AS 式1 FROM book, daityou WHERE (((book.bookname)=[daityou].[bookname])); <<<<クエリ9>>>> SELECT クエリ8.author,sum(Expr1002) from クエリ8 group by author; として、ひとつのSQL文にするにはどうすればいいですか? よろしくお願いします。

  • SQL文の書き方

    お世話になっております。 現在、SQLServer2000(SP4)を使用しています。 次の結果を求めるSQL文を作りたいのですが、中々上手く行きません。 良い方法を教えて下さい。 あるテーブル(tableA)にレコードが以下のようにあるとします。 【基本コード】【大分類】【中分類】    1      1    3    1      1    4    1      2    1    2      1    99    2      18    1    3      3    2 やりたい事は、【基本コード】毎に、【大分類】【中分類】の最小値を取得したいので、下記の結果を得たいのですが、 期待する結果↓ 【基本コード】【大分類】【中分類】    1      1    3    2      1    99    3      3    2 現在考えているSQL文では、下記のようになってしまいます。 実際の結果↓ 【基本コード】【大分類】【中分類】    1     1     3    2     1     3    3     3     3 現在考えているSQL文↓ SELECT  基本コード,  MIN(大分類) AS 大分類,  (SELECT MIN(中分類) FROM tableA WHERE 大分類 = (SELECT MIN(大分類) FROM tableA) GROUP BY 大分類) AS 中分類 FROM tableA GROUP BY 基本コード 中分類を求める場合の、大分類の指定の仕方が悪いのはわかるのですが、どう直したら良いのか分からず困っています。 宜しくお願いします。

  • SQLファイルでのパラメータ指定の方法

    いつもお世話になっております。 以下のようなスクリプトを含むSQLファイルで「1234」を何回も記述したくないので、スクリプト上部で1回パラメータ指定する書き方をご教授願います。実行はSQLServerのクエリアナライザで行いたいです。 SELECT * FROM 顧客 WHERE 会社CD=1234; SELECT * FROM 商品 WHERE 会社CD=1234; よろしくお願いします。

  • SQLServer2005のSQL文での別名の取り扱い

    現在VB.net2005とSQLServer2005にてプログラムを組んでいます。 以下のように、サブクエリにて抽出されたStockテーブルと Tagテーブルを結合するSQL文を組みました。 *行頭は列番号です。 01- SELECT * FROM 02- ( 03-  SELECT A1.*, A3.* FROM 04-   ( 05-    SELECT A2.* FROM stock AS A2 06-    WHERE A2.StockDay < #日付#  '【SQLserverで流す時は "CONVERT(DATETIME, '日付')"】 07-    AND A2.ShopCode = '店番号' 08-   ) AS A1 09-  LEFT JOIN tag AS A3 10-  ON A1.StockNo = A3.StockNo 11- ) AS S1 これだとACCESS2000のクエリ上では正しく実行できます。 しかし、.net2005のサーバエクスプローラ上で上記SQL文を流しても、 「列 'StockNo' が 'S1' に複数回指定されました。」 とエラーが出てしまい実行することができません。 行03を "SELECT A1.* FROM" にするとSQLServer2005でも動きますが、 tagテーブルのフィールドが結果に含まれません。 tagテーブルのフィールドも結果に含みたいです。 どなたか原因や回避方法をご存知の方いらっしゃいましたら、 お手数ですが是非ともご教示頂きたいです。 よろしくお願い致します。

  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。