2016-06-20 11 views
0

次のエラーメッセージが表示されます。サブクエリが2つ以上の値を返しました。エラー

サブクエリが1より大きい値を返しました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

私が問題を抱えているコードのセクションは、私のselectステートメントにあります。

,(SELECT COUNT(sch.startdate) 
     FROM #test AS sch 
     WHERE L.Id = sch.id 
     GROUP BY sch.id, sch.startdate 
     HAVING sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

現在、テスト用のテンポラリテーブルには1つのレコードしかなく、2つがある場合は分けられます。私はそれを制限するためにトップ1を使うことができることを知っているが、それは私が望むものではない。 Lはメインのselectステートメントからのものです。一時テーブルそう

OK]をクリックして次のデータを持っている:私のコードでTOP 1で

ID startdate 
1 2014-10-02 
1 2014-11-02 
2 2014-11-02 

私は以下の結果を得る:

ID ~Other Stuff~ SC 
1 ~~~~~~~~~~~~~ 1 
2 ~~~~~~~~~~~~~ 1 

しかし、私は返すことにしたいことは次のとおりです。

ID ~Other Stuff~ SC 
1 ~~~~~~~~~~~~~ 2 
2 ~~~~~~~~~~~~~ 1 

これを達成するためにコードを変更するにはどうすればよいですか?

ありがとうございました。

+1

良い答えを得るために、あなたはまだ「メイン」 'from'句、だけではなくサブクエリを表示する必要があります。概念的には、サブクエリ内の 'group by'を取り除き、本質的に' where sch.id = main.id'行を使ってそれをメインクエリに結びつける 'where'節を使いたいとします。 – tarheel

答えて

0

何を数えようとしているかによって異なります。 HAVING句をWHERE句に移動できることも表示されます(追加情報なし)。

あなたは#testその試合から行をカウントしようとしている場合:あなたはユニークなSTARTDATE値をカウントしようとしている場合

,(SELECT COUNT(*) 
    FROM #test AS sch 
    WHERE L.Id = sch.id 
    AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

,(SELECT COUNT(DISTINCT sch.startdate) 
    FROM #test AS sch 
    WHERE L.Id = sch.id 
    AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

あなたはのユニークな組み合わせをカウントしようとしている場合(id、startdate)次に、別のレベルのクエリが必要だと思います。

,(SELECT COUNT(*) FROM (
     SELECT sch.id, sch.startdate 
     FROM #test AS sch 
     WHERE L.Id = sch.id 
     AND sch.startdate >= L.T_Start AND sch.startdate <= @END 
     GROUP BY sch.id, sch.startdate) 
    AS X) AS SC 

COUNT (Transact-SQL)

0

GROUP BYからsch.startdateを削除します。グループ化されていないStartDatesを数えたいとします。

+0

私はそれがL.Idによってまだグループ化されているので、削除すべき全体のGROUP BYだと思うでしょう。 –

+0

Group By全体を削除して目的の結果を得ることは可能ですが、それは望ましくない動作を引き起こしている部分であるため、startdateについてのみ言及しました。 –

0

HAVINGは、グループ全体にいくつかの条件が該当するグループを除外するために使用されます。通常、これはあなたのグループからの集計です。

HAVING sum(amount) > 10 

あなたは

(それはあなたのGROUP BYでの集計とないではありませんので)行レベルでL.T_startを引っ張っている
HAVING sch.startdate >= L.T_Start --... 

を置きます。

あなたがやろうとしている内容に応じて

、いずれかのWHERE句に

または

はそれを集計を行う(文の前のグループから行をフィルタリングする)こと

移動(たとえば、その条件等 grouで最大(sch.startdate> L.T_start)など

または

基を有しますpによって - ...、 ケースの場合、sch.startdate> L.T_start then 1 else 0 end - ... 最後のオプションは2つのグループを与えることができるので、そのCASE文も差異を識別するための選択リスト内の列。

関連する問題