2016-11-12 14 views
1

私はこのクエリの再利用のための変数を宣言します:列データから変数値を設定するにはどうすればよいですか?

SELECT 
    SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email)), 
    COUNT(*) 
FROM 
    Student 
GROUP BY 
    SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email)) 

変数がSUBSTRING(Email,CHARINDEX('@', Email)+1,LEN(Email)-CHARINDEX('@', Email))

を保持している。しかし、列のデータがSELECT文の外に到達できないようです:

DECLARE @exp NVARCHAR(20) =  
    SUBSTRING(Email,CHARINDEX('@', Email)+1,LEN(Email)-CHARINDEX('@', Email)) 

答えて

2

これを行う1つの方法は、ビューを使用します。別のユーザーはCTEを使用します。それはお互いを参照する変数の多くを追加することが容易になりますので、私はOUTER APPLYを使用してのように起こる:あなたは書くことができ

SELECT domain, COUNT(*) 
FROM Student s OUTER APPLY 
    (VALUES (SUBSTRING(s.Email, CHARINDEX('@', s.Email) + 1, LEN(s.Email) - CHARINDEX('@', s.Email))) 
    ) v(domain) 
GROUP BY domain; 

または、:

SELECT domain, COUNT(*) 
FROM Student s OUTER APPLY 
    (VALUES (CHARINDEX('@', s.Email)) 
    ) as pos(pos) 
    (VALUES (SUBSTRING(s.Email, pos.po + 1, LEN(s.Email) - pos.pos)) 
    ) v(domain) 
GROUP BY domain; 

そして、最後に、あなたはこの表現を見つけるかもしれません容易:

SELECT domain, COUNT(*) 
FROM Student s OUTER APPLY 
    (VALUES (STUFF(s.Email, 1, CHARINDEX('@', s.Email), '')) 
    ) v(domain) 
GROUP BY domain; 

この単純化では、追加の変数をまったく必要としないこともあります。

+0

「v」とは何ですか、なぜそれは任意の文字ですか? –

+2

@MohamedAhmed 'FROM'節で使用される_derivedテーブル_に_alias_が必要です。 [Ref](https://msdn.microsoft.com/en-us/library/ms177634.aspx) 'Zelmo'という名前にすることもできます。 – HABO

関連する問題