2011-10-23 2 views
1

私が働くこのクエリ...で値を選択2本の要約の減算

select 
    t.date, 
    sum(gk.d) as d, 
    sum(gk.p) as p, 
    (sum(d)-sum(p)) as s 

しかし、私は思ったんだけど値「S」DP、このようなものとしてを選択する方法がありますがあります。

select 
    t.date, 
    sum(gk.d) as d, 
    sum(gk.p) as p, 
    (d-p) as s // not working 

答えて

4

SQLは、最初のバージョンがあなたのために動作しますが、2番目にはない理由で同じSELECT句に列の別名を参照してサポートしていません。 - したがって、あなたがすることもでき、「AS X」

3

SELECT docセクションの「SELECT文の論理処理順序」を参照してください。彼らはエイリアスで列を参照する理由と理由を説明しています。 一般的な回避策は、派生テーブルまたはCTEを使用することです。
だから、あなたのために働く必要があります。一般的には

SELECT d, p , d-p AS s 
FROM 
(
    select 
    t.date, 
    sum(gk.d) as d, 
    sum(gk.p) as p 
    FROM .... 
)a 
2

をSQL Serverが派生テーブル/インライン・ビューのためにテーブルの別名を定義する必要があります

SELECT x.date, 
     x.d, 
     x.p, 
     x.d - x.p AS s 
    FROM (SELECT t.date, 
       SUM(gk.d) AS d, 
       SUM(gk.p) AS p, 
      FROM t 
      JOIN gk ON ...) AS x 

マインドこと:代替は、派生テーブル/インライン・ビューを使用することですSQL2008で共通テーブル式を使用する:

WITH sumCTE AS 
(
    SELECT t.date 
     , SUM(gk.d) as d 
     , SUM(gk.p) as p 
    FROM ... 
) 
SELECT d, p, d - p AS s 
FROM sumCTE 
+0

'WITH'構文は、派生テーブル/インラインビューの構文砂糖です。この例では、パフォーマンス上の利点はありません。また、2005年以降(限られたサポート以外にも、MySQLはWITH句をまだサポートしていません)です。 –