0

ローカル変数に、変数の「SET」で宣言されていない SELECT ステートメントから「FROM」ステートメントを使用させる方法があるかどうか疑問に思っています。次の例があります。

DECLARE @IDNO int;
DECLARE @ORDERQUANTITY int;

SET @IDNO='1';  --TEST VALUE
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY), 0);

SELECT
Table1.IdNo AS 'ID No',
@ORDERQUANTITY AS 'Order Quantity'

FROM Table1

WHERE IdNo = @IDNO
GROUP BY IdNo, QUANTITY

列を追加する列がたくさんあります。これらの列は、@ORDERQUANTITY変数のようなステートメントから派生しています。

したがって、SELECT ステートメントに長い列定義を含める代わりに、変数に何かを配置して、SELECT ステートメントをよりシンプルにしたいと考えています。

例えば

SELECT @ORDERQUANTITY - @ORDERSCANCELLED AS 'Net Sold'

これにアプローチする最良の方法をいただければ幸いです。

(SQL サーバーを使用)

4

2 に答える 2

1

もしかして:

SELECT @ORDERQUANTITY = COALESCE((SELECT SUM(QUANTITY) FROM dbo.Table1), 0);

後続のクエリを読みやすくすることが目標である場合は、変数名を短くし、.xml を使用しないことをお勧めし@ALLCAPSFORVARIABLENAMESBECAUSETHEYARENOTVERYREADABLEます。

また、あなたが何をしようとしているのかわかりGROUP BYませんが、まったく必要ないようです(定数によるグループ化は、いずれの場合も何もしません)。

さて、あなたがやろうとしていることを完全にフォローしているかどうかはわかりません。SUM(QUANTITY)リスト内で複数回繰り返す必要がなく、value* ではなくを変数SELECTに置き換えたいと言っているのですか? コードから判断するのは難しいですが、これはテーブル全体を表しているのでしょうか、それとも特定の ID だけを表しているのでしょうか? いくつかのアイデア:SUM

  1. 特定の ID に対して 1 つの行のみを探している場合は、CTE/派生テーブルを使用して、計算を繰り返す必要がないようにします。

    ;WITH x AS 
    (
      SELECT oq = SUM(Quantity), oc = SUM(Cancelled)
      FROM dbo.Table1 WHERE IdNo = @IDNO
    )
    SELECT
      [Total Sold] = oq,
      [Cancelled] = oc, 
      [Net Sold] = oq - oc
    FROM x;
    
  2. 最初にテーブル全体の合計を計算する場合は、次のようにして、これらの計算を 1 回だけ実行するだけで済みます。

    SELECT
      @oq = SUM(Quantity),
      @oc = SUM(Cancelled)
    FROM dbo.Table1;
    
    ... and use those variables later ...
    
  3. 1 つの変数に複数の値の値を保持しようとしている場合は@IDNO、これについて別の考え方をする必要があります。複数の行のセットを扱うときは、変数を保持タンクと考えるのをやめてください。どのように達成できると思うかではなく、実際に達成したいことを教えてください。

最後に、AS 'single quotes'エイリアスの使用を停止してください。列のエイリアスに不正な文字や予約語が必要な場合は、AS [square brackets]代わりに Google までご連絡ください。

于 2013-04-05T17:54:58.397 に答える