2017-03-22 5 views
0

最初にタイトルを謝罪しますが、それを1行に入れる方法はわかりません。入れ子のSELECTが最初のSELECTの値を入力として受け取る別のSELECTステートメントの中でSELECTを使用する

すべてのマスターアカウントには、1つ以上のサブアカウントがあります。設定方法は、すべてのアカウントにユニークなlskinidがあることです。アカウントがマスターアカウントの場合、lskinidとmasterlskinは同じlskinidを保持しているため同じです。 アカウントがサブアカウントの場合は、列masterlskinの下にマスターアカウントのlskinidが保持されます。これにより、サブアカウントを含むすべてのアカウントには、独自のアカウント名(refname)が設定されています。 問題がどこから始まるのですか。マスタアカウントの名前(マスタアカウントの名前)を選択し、2番目の列をそのマスタアカウントのサブアカウントの総数としたいとします。私はマスターアカウント(masterlskin) でグループ化しているので、アカウント名(refname)のレコードは複数ありますが、マスターアカウントのrefnameを表示したいと思います。

私がこれまでで何をしたか

SELECT count(lskinid) AS "Total Subaccounts", 
(SELECT refname FROM lskin WHERE lskinid = masterlskin) AS "Account Name" 
FROM lskin 
WHERE isactive = 1 
Group by masterlskin 
order by count(lskinid) DESC 

表のlskinがあります -refname(アカウント名) -lskinid(accouontのID) は-masterlskin(マスターアカウントID) -isactive(ある場合アクティブアカウント) 。 。

サブクエリが複数のレコードを返すため、これは機能しません。これは、そのテーブルのすべてのレコードを調べているためです。現在の行でのみ値を取得するようにサブクエリに指示する方法はありますか?より正確には、現在の行のmasterlskinの値を取得するために、変数MASTERLSKIN(サブクエリですべての大文字を書いたもの)を使用しますか? enter image description here

更新: 私はそれを修正

は、私はこのエラーメッセージを取得しています事前

でいただきありがとうございます。 「中」の部分の1つは大括弧で囲まれていませんでした。それを追加し、現在は完璧に動作しています。

+1

あなたが探している用語が*相関サブクエリです* :) – DavidG

+0

@DavidGとそのopはちょうど 'JOIN'(または多分' OUTER APPLY')が必要と思われる – Lamak

+0

@Lamak確かに、それはおそらくですOPを混乱させるGROUP BY。 – DavidG

答えて

1
SELECT count(lskinid) AS "Total Subaccounts", 
(SELECT refname FROM lskin as [in] WHERE in.lskinid = out.masterlskin) AS "Account Name" 
FROM lskin as [Out] 
WHERE isactive = 1 
Group by masterlskin 
order by count(lskinid) DESC 
+0

このクエリを実行すると、次のエラーメッセージが表示されます。 メッセージ156、レベル15、状態1、行2 'in'というキーワードの構文が正しくありません。 – DoArNa

+0

気にしないで、相関サブクエリのWHERE句の後ろの角括弧をinに追加して、現在は完璧に動作しています。どうもありがとうございます。 – DoArNa

1

これはあなたが探しているものです、私はあなたと一緒に遊ぶための一時テーブルと同様のシナリオだと思います。

内部結合では、マスターにリンクされた各サブアカウントの行が表示され、マスター上でグループ化され、サブIDの数がカウントされます。 ...この情報がお役に立てば幸い

Declare @MasterAccs TABLE (id int,active bit, name varchar(10)) 
Declare @SubAccs TABLE (id int,masterid int, name varchar(10)) 

Insert Into @MasterAccs VALUES (1,1,'Master A') 
Insert Into @MasterAccs VALUES (2,0,'Master B') 
Insert Into @MasterAccs VALUES (3,1,'Master C') 

Insert Into @SubAccs VALUES (1,1,'Sub 1') 
Insert Into @SubAccs VALUES (2,1,'Sub 2') 
Insert Into @SubAccs VALUES (3,2,'Sub 3') 
Insert Into @SubAccs VALUES (4,2,'Sub 4') 
Insert Into @SubAccs VALUES (5,2,'Sub 5') 
Insert Into @SubAccs VALUES (6,3,'Sub 6') 
Insert Into @SubAccs VALUES (7,3,'Sub 7') 
Insert Into @SubAccs VALUES (8,3,'Sub 8') 
Insert Into @SubAccs VALUES (9,3,'Sub 9') 

Select * From @MasterAccs 
Select * From @SubAccs 

Select m.name AccountName, Count(s.id) TotalSubs 
From @MasterAccs m 
Inner Join @SubAccs s ON m.id = s.masterid 
Where m.active = 1 GROUP BY m.name 

EDIT: それでは、どのようにこれはあなたの新しい情報を与えについて.... その効果的にフィルタリングを行う、独自のテーブルとしてお使いORIGからマスターレコードを治療するためのCTEを使用してここでアクティブにすると、最後の選択での結合はグループ化とカウントを行い、カウントにはマスターレコードが含まれます。カウントに-1を指定するか、where句でマスターを除外する。

Declare @lskin TABLE (lskinid int, masterlskin int, name varchar(10)) 

Insert into @lskin VALUES (1,1,'Master A') 
Insert into @lskin VALUES (2,1,'Sub 1') 
Insert into @lskin VALUES (3,1,'Sub 2') 
Insert into @lskin VALUES (4,4,'Master B') 
Insert into @lskin VALUES (5,4,'Sub 1') 

;With Masters as (Select name, masterlskin From @lskin where lskinid = masterlskin) 
Select M.name MasterName, count(lskinid) SubAccounts 
From Masters M Inner Join @lskin s on M.masterlskin = s.masterlskin 
Group by M.name 
+0

サブアカウントとマスターアカウントが同じテーブルにあるため、このシナリオとは少し異なります。あなたがそのlskinidとmasterlskinが同じ数である見ることができるので 1つのGMC 1つの 2つのGMCダラス1 3 GMCシカゴ1 4フォード4 レコード番号1 asterlskin lskinidもしrefnameは、マスターアカウントです。しかし、レコード2とレコード3は、レコード1のマスターIDを保持しているため、サブアカウントです。レコード番号4は別のマスターアカウントで、独自のmasterlskin IDを持っています。 – DoArNa

+0

編集された解決策は、私はあなたが少し良いと理解しています:) – Ollie

+0

はい、これはシナリオであり、今は完璧に動作しています。私はCTEについて知りません...ありがとうございます – DoArNa

関連する問題