2017-09-28 8 views
0

this questionで使用されるメソッドを複製する方法があるかどうかは知っていますか?サブクエリのエイリアスを使用してt-SQLの別のフィールドで計算を実行しますか?別のフィールドの計算でエイリアスを使用する方法

私は、MS SQL Expressの次のクエリのために同じ構文を使用してみましたし、下記のエラーました:

DECLARE @PracticeID INT 
DECLARE @Date1 date 
DECLARE @Date2 date 

SET @PracticeID = 11015 
SET @Date1 = '2017-06-01' 
SET @Date2 = '2017-09-01' 

SELECT prtc.PracticeName ,COUNT(CASE WHEN udi.DevicePlatform = 'iOS' THEN 1 ELSE NULL END) iOSLogins, 
      COUNT(CASE WHEN udi.DevicePlatform = 'Android' THEN 1 ELSE NULL END) AndroidLogins, 
      (SELECT COUNT(*) 
      FROM UserEvent UE 
      WHERE UE.EventTypeID = 1 AND 
        UE.PracticeID = au.PracticeID AND 
        (UE.EventDate BETWEEN @Date1 and @Date2) 
     ) TotalNumberLogins, 
      (SELECT TotalNumberofLogins) - ((SELECT iOSLogins) + (SELECT AndroidLogins)) DesktopLogins 
    FROM UserDeviceInfo UDI JOIN 
     AppUser AU ON udi.UserID = au.UserID JOIN 
     Practice PRTC ON au.PracticeID = prtc.PracticeID 
    WHERE au.PracticeID = @PracticeID AND 
      (udi.Created BETWEEN @Date1 AND @Date2) 
    GROUP BY prtc.PracticeName, au.PracticeID 

メッセージ207、レベル16、状態1、行17無効な列名 「をTotalNumberofLogins 'メッセージ207、レベル16、状態1、行17無効な 列名 'iOSLogins'。メッセージ207、レベル16、状態1、行17無効な 列名 'AndroidLogins'。

違いはありますが、エイリアスを引用符と括弧で入れてみてみました。

私は、エイリアスの代わりに変数と同じ値を使用して計算を実行し、テーブルにそれらを挿入することによって、別の方法から望ましい結果を得ることができました。

しかし、このクエリは冗長で、将来の使用のために参照された質問の動作を複製する方法があるかどうかを知りたいと思います。

ご協力いただきありがとうございます。

答えて

0

この方法はSQL Serverでは機能しません。あなたはカップルの異なる方法で同じことを達成することができます

1)の代わりに、エイリアスの各エイリアス列のコードを使用します

(SELECT COUNT(*) 
FROM UserEvent UE 
WHERE UE.EventTypeID = 1 
AND UE.PracticeID = au.PracticeID 
AND (UE.EventDate BETWEEN @Date1 and @Date2) 
- COUNT(CASE WHEN udi.DevicePlatform = 'iOS' THEN 1 ELSE NULL END) 
+ COUNT(CASE WHEN udi.DevicePlatform = 'Android' THEN 1 ELSE NULL END) Desktop Logics 

2)の列を作るために派生テーブルを使用して、あなたは別名によってそれらを参照することができます

SELECT PracticeName, iOSLogins, AndroidLogins, TotalNumberLogins, 
     (TotalNumberofLogins - (iOSLogins + AndroidLogins)) DesktopLogins 
FROM (
     SELECT prtc.PracticeName, 
       COUNT(CASE WHEN udi.DevicePlatform = 'iOS' THEN 1 ELSE NULL END) iOSLogins, 
       COUNT(CASE WHEN udi.DevicePlatform = 'Android' THEN 1 ELSE NULL END) AndroidLogins, 
      (SELECT COUNT(*) 
       FROM UserEvent UE 
       WHERE UE.EventTypeID = 1 
       AND UE.PracticeID = au.PracticeID 
       AND (UE.EventDate BETWEEN @Date1 and @Date2) 
      ) TotalNumberLogins, 
     FROM UserDeviceInfo UDI 
     JOIN AppUser AU ON udi.UserID = au.UserID 
     JOIN Practice PRTC ON au.PracticeID = prtc.PracticeID 
     WHERE au.PracticeID = @PracticeID 
     AND (udi.Created BETWEEN @Date1 AND @Date2) 
     GROUP BY prtc.PracticeName, au.PracticeID 
    ) a --table alias 

編集を:表の別名は、単純なクエリでは

を説明した:

SELECT col1 FROM Table 

col1のテーブルリファレンスはTableです。 (Table.Col1)唯一のcol1の場合は書き込む必要はありませんが、参照しているテーブルはまだ分かります。単純な派生テーブルで

SELECT col1 FROM (SELECT col1 FROM Table) 

インナー列のテーブル参照がまだTable、しかし外側の周りですか?この場合、カッコ内のすべてがあなたのテーブルですが、上の例ではそのテーブルは名前が付けられていません。 SQL Serverでは、作成したテーブルに名前を付けて参照できるようにする必要があります。

SELECT col1 FROM (SELECT col1 FROM Table) MyDerivedTable 

...そして今、あなたの外側の列のテーブル参照を持っている:

SELECT MyDerivedTable.col1 
FROM (SELECT col1 FROM Table) MyDerivedTable 
JOIN Table T on T.col1 = MyDerivedTable.col1 
+0

あなたの第二の提案は、私は正確な答えのタイプだった:

SELECT MyDerivedTable.col1 FROM (SELECT col1 FROM Table) MyDerivedTable 

また、一回以上のテーブルが関与している。このため大きな必要性を見ることができます探していた一束のAaronに感謝、あなたはすばらしい助けをしてきました。副次的な理由として、 'a'テーブルエイリアスを削除すると、クエリが失敗するのはなぜですか? –

+0

@ W.Harrお手伝いします。エイリアスの説明を自分の答えに加えましたが、コメントとして書き込むには時間がかかりすぎました。簡単な答えは、結果セットから擬似テーブルを作成することです.SQL Serverでは、テーブルを参照できるようにテーブルの名前を付ける必要があります。 –

+0

徹底的に説明していただきありがとうございます –

関連する問題