質問

SQL Server 2005を使用して、サブクエリを含むcaseステートメントに基づいてグループ化しようとしていますが、エラーが発生しています("各GROUP BY式には少なくとも1つの列参照が含まれている必要があります。 ")。簡単に回避できますが、エラーを説明できる人はいますか? #header.headerへの列参照があります。

create table #header (header int)
create table #detail (header int, detail int)

insert into #header values (1)
insert into #header values (2)
insert into #header values (3)

insert into #detail values (1, 1)
insert into #detail values (2, 1)

--error: Each GROUP BY expression must contain at least one column reference.
select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
group by case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end

--results I want
select hasrecords, count(*) from
(
    select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
) hasrecords
group by hasrecords

drop table #header
drop table #detail

[編集]注釈付き(コメントに対する)相関サブクエリと非相関サブクエリ:

--correlated
select header, case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header

--non-correlated
select #header.header, case when count(#detail.header) > 0 then 1 else 0 end hasrecords from #header left join #detail on #header.header = #detail.header group by #header.header
役に立ちましたか?

解決

開始するには、完全なエラーを指定する場合、「各GROUP BY式には、外部参照ではない列が少なくとも1つ含まれている必要があります。"

エラーを理解するには、「外部参照」

の意味を明確にする必要があります

(注:この場合、内部結合または外部結合とは関係ありません)

内部および外部は、メインクエリとそのサブクエリを参照しています。 この場合、 EXISTS はサブクエリであり、#header.header <の外部参照があるため、 相関 サブクエリです。 / code>は、外部テーブル #header を参照していますが、 #detail への参照は内部参照と見なされます。

本質的に、 CASE は外部クエリを参照する相関サブクエリを使用するため、GROUP BYで式のみを使用しようとするとこのエラーメッセージが表示されるため、エラー状態が発生します外部参照として解釈される句。

サブクエリ はGROUP BYで使用できますが、相関サブクエリは使用できません。

紛らわしいことに、同じエラーは、サブクエリのない、より単純なクエリなどによって生成される可能性があります

select 
 case when header=1 then 1 
      else 0 
 end headeris1, 
 'constant' 
from #header 
group by case when header=1 then 1 else 0 end , 'constant'

または定数を @variable

に置き換えます

泥としてクリアしますか

Kev

他のヒント

値ではなく(ヘッダー)でグループ化する実際の列を指定する必要がある場合、1または0でグループ化するように指示しています。

だから、私が正しく理解しているなら、ヘッダーのリストとその詳細レコードのカウントが必要ですか?

これはあなたのために働くかもしれませんか?

SELECT DISTINCT h.header, COUNT(d.detail) AS detail_count
FROM #header AS h
LEFT JOIN #detail AS d ON d.header = h.header
GROUP BY h.header, d.detail

次のような結果で...

header   detail_count
1       1
2       1
3       0
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top